成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java虛擬機是如何執行線程同步的

開發 開發工具 虛擬化
想介紹下synchronized的原理,但是又不知道從何下手,在網上看到一篇老外的文章,介紹了和線程同步相關的幾個基礎知識點。所以想把它翻譯一下給大家看看。相信看過這些基礎知識之后再看我后面要寫的synchronized的原理就會好理解一點了。

想介紹下synchronized的原理,但是又不知道從何下手,在網上看到一篇老外的文章,介紹了和線程同步相關的幾個基礎知識點。所以想把它翻譯一下給大家看看。相信看過這些基礎知識之后再看我后面要寫的synchronized的原理就會好理解一點了。

了解Java語言的人都知道,Java代碼要想被JVM執行,需要被轉換成由字節碼組成的class文件。本文主要來分析下Java虛擬機是如何在字節碼層面上執行線程同步的。

線程和共享數據

Java編程語言的優點之一是它在語言層面上對多線程的支持。這種支持大部分集中在協調多個線程對共享數據的訪問上。JVM的內存結構主要包含以下幾個重要的區域:棧、堆、方法區等。

在Java虛擬中,每個線程獨享一塊棧內存,其中包括局部變量、線程調用的每個方法的參數和返回值。其他線程無法讀取到該棧內存塊中的數據。棧中的數據僅限于基本類型和對象引用。所以,在JVM中,棧上是無法保存真實的對象的,只能保存對象的引用。真正的對象要保存在堆中。

在JVM中,堆內存是所有線程共享的。堆中只包含對象,沒有其他東西。所以,堆上也無法保存基本類型和對象引用。堆和棧分工明確。但是,對象的引用其實也是對象的一部分。這里值得一提的是,數組是保存在堆上面的,即使是基本類型的數據,也是保存在堆中的。因為在Java中,數組是對象。

除了棧和堆,還有一部分數據可能保存在JVM中的方法區中,比如類的靜態變量。方法區和棧類似,其中只包含基本類型和對象應用。和棧不同的是,方法區中的靜態變量可以被所有線程訪問到。

對象和類的鎖

如前文提到,JVM中有兩塊內存區域可以被所有線程共享:

  • 堆,上面存放著所有對象
  • 方法區,上面存放著靜態變量

那么,如果有多個線程想要同時訪問同一個對象或者靜態變量,就需要被管控,否則可能出現不可預期的結果。

為了協調多個線程之間的共享數據訪問,虛擬機給每個對象和類都分配了一個鎖。這個鎖就像一個特權,在同一時刻,只有一個線程可以“擁有”這個類或者對象。如果一個線程想要獲得某個類或者對象的鎖,需要詢問虛擬機。當一個線程向虛擬機申請某個類或者對象的鎖之后,也許很快或者也許很慢虛擬機可以把鎖分配給這個線程,同時這個線程也許永遠也無法獲得鎖。當線程不再需要鎖的時候,他再把鎖還給虛擬機。這時虛擬機就可以再把鎖分配給其他申請鎖的線程。

類鎖其實通過對象鎖實現的。因為當虛擬機加載一個類的時候,會會為這個類實例化一個 java.lang.Class 對象,當你鎖住一個類的時候,其實鎖住的是其對應的Class 對象。

監視器(Monitors)

監視器和鎖同時被JVM使用(我理解作者的意思應該是想說鎖其實是通過監視器實現的。),監視器主要功能是監控一段代碼,確保在同一時間只有一個線程在執行。

每個監視器都與一個對象相關聯。當線程執行到監視器監視下的代碼塊中的***條指令時,線程必須獲取對被引用對象的鎖定。在線程獲取鎖之前,他是無法執行這段代碼的,一旦獲得鎖,線程便可以進入“被保護”的代碼開始執行。

當線程離開代碼塊的時候,無論如何離開,都會釋放所關聯對象的鎖。

多次加鎖

同一個線程可以對同一個對象進行多次加鎖。每個對象維護著一個記錄著被鎖次數的計數器。未被鎖定的對象的該計數器為0,當一個線程獲得鎖后,該計數器自增變為 1 ,當同一個線程再次獲得該對象的鎖的時候,計數器再次自增。當同一個線程釋放鎖的時候,計數器再自減。當計數器為0的時候。鎖將被釋放,其他線程便可以獲得鎖。

同步

在Java中,當有多個線程都必須要對同一個共享數據進行訪問時,有一種協調方式叫做同步。Java語言提供了兩種內置方式來使線程同步的訪問數據:同步代碼塊和同步方法。

這篇文章中后面還介紹了同步代碼塊和同步方法,以及簡單的介紹了下實現方式。這里就不做翻譯了,因為我覺得他介紹的太簡單了。我后面專門寫篇文章詳細介紹。

原文地址:How the Java virtual machine performs thread synchronization

【本文是51CTO專欄作者Hollis的原創文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2010-02-26 15:28:15

Python虛擬機

2024-11-11 11:21:30

虛擬機Python跳轉表

2023-09-03 17:05:20

虛擬機

2019-03-05 14:59:42

Java虛擬機加載類

2009-06-12 16:15:42

死鎖Java虛擬機

2010-02-24 10:39:28

Python虛擬機

2018-04-04 15:05:17

虛擬機字節碼引擎

2010-12-23 14:05:12

虛擬機

2012-04-10 10:29:29

2010-01-13 14:37:39

CentOS VMwa

2012-05-18 10:22:23

2022-08-14 09:11:13

Kubernetes容器云原生

2018-06-19 15:39:21

HeapJava虛擬機

2011-06-22 13:35:55

JVM

2009-10-13 15:00:36

物理機虛擬機網絡安全

2020-01-17 10:52:37

無服務器容器技術

2010-01-18 10:15:50

虛擬機ubuntu

2010-12-27 14:11:55

虛擬機配置CPU

2009-06-12 16:02:58

裝載Java虛擬機

2023-09-02 21:35:39

Linux虛擬機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产伦精品一区二区三区精品视频 | 少妇一级淫片aaaaaaaaa | 99中文字幕 | 国产乱码精品1区2区3区 | 久久网亚洲| 视频一区在线观看 | 成人在线播放网站 | 国产精品日韩一区二区 | 欧美成人精品 | 国产欧美日韩精品一区二区三区 | 欧美高清成人 | 艹逼网 | 伊人网在线综合 | 中文字幕av在线播放 | 日韩成人一区 | 亚洲一区二区三区视频 | 天天天天天天天干 | 日韩中文在线 | 国产精品国产三级国产aⅴ原创 | 国产成人在线一区二区 | 在线一区二区三区 | 成人特级毛片 | 国产欧美视频一区二区三区 | 国产精品一二区 | 久久久久久成人 | 国产二区视频 | 国产欧美精品在线 | 国产精品夜夜春夜夜爽久久电影 | 男人天堂手机在线视频 | 丁香一区二区 | 在线视频亚洲 | 7777在线视频免费播放 | 精品福利视频一区二区三区 | 国产亚洲精品久久yy50 | 成人免费在线小视频 | 日韩精品在线一区二区 | 成人一区二区三区视频 | 一级黄色片一级黄色片 | 色综合一区二区 | 免费影视在线观看 | 狠狠干狠狠操 |