亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

淺談Java并發(fā)編程系列(七) —— 深入解析synchronized關(guān)鍵字

piglei / 2624人閱讀

摘要:第一個(gè)字被稱為。經(jīng)量級(jí)鎖的加鎖過程當(dāng)一個(gè)對(duì)象被鎖定時(shí),被復(fù)制到當(dāng)前嘗試獲取鎖的線程的線程棧的鎖記錄空間被復(fù)制的官方稱為。根據(jù)鎖對(duì)象目前是否處于被鎖定狀態(tài),撤銷偏向后恢復(fù)到未鎖定或經(jīng)量級(jí)鎖定狀態(tài)。

Synchronized關(guān)鍵字

synchronized的鎖機(jī)制的主要優(yōu)勢是Java語言內(nèi)置的鎖機(jī)制,因此,JVM可以自由的優(yōu)化而不影響已存在的代碼。

任何對(duì)象都擁有對(duì)象頭這一數(shù)據(jù)結(jié)構(gòu)來支持鎖,但是對(duì)于較大的對(duì)象系統(tǒng)開銷會(huì)更大一些。

java中的每一個(gè)對(duì)象都至少包含2個(gè)字(24 Bytes for 32bits & 28 Bytes for 64bits, 不包括已壓縮的對(duì)象)。第一個(gè)字被稱為Mark Word。這是一個(gè)對(duì)象的頭,它包含了不同的信息,包括鎖的相關(guān)信息。
第二個(gè)字是指向metadata class的指針,metadata class字義了對(duì)象的類型。這部分也包含了VMT(Virtual Method Table)。

Mark Word 的結(jié)構(gòu)如下所示:

Mark Word根據(jù)最低兩位(Tag)的所表示的狀態(tài),編碼了不同的信息。
如果這個(gè)對(duì)象沒有被用作鎖,Mark Word 記錄了hashcode和對(duì)象年齡(for GC/survivors)。
除此之外,有3種狀態(tài)對(duì)應(yīng)鎖:輕量級(jí)鎖,重量級(jí)鎖和偏向鎖。

經(jīng)量級(jí)鎖

所有現(xiàn)代JVM都引入了經(jīng)量級(jí)鎖:

避免將每個(gè)對(duì)象關(guān)聯(lián)操作系統(tǒng)的mutex/condition變量(重量級(jí)鎖)

當(dāng)不存在鎖競爭時(shí),使用原子操作來進(jìn)入退出同步塊

如果發(fā)生鎖競爭,回退到操作系統(tǒng)的重量級(jí)鎖

引入輕量級(jí)鎖會(huì)提供鎖效率,因?yàn)榇蟛糠宙i都不存在競爭。

經(jīng)量級(jí)鎖的加鎖過程:

當(dāng)一個(gè)對(duì)象被鎖定時(shí),mark word被復(fù)制到當(dāng)前嘗試獲取鎖的線程的線程棧(Execution stack)的鎖記錄空間(lock record), 被復(fù)制的mark word官方稱為displaced mark。

使用CAS操作來嘗試使 mark word指向當(dāng)前線程的鎖記錄空間(即在mark word中存入使用當(dāng)前線程鎖記錄空間的指針——stack pointer)。

如果CAS操作成功,則線程獲得鎖。

如果CAS操作失敗,即表明存在鎖競爭,則發(fā)生鎖膨脹,回退到重量級(jí)鎖。

鎖記錄空間中記錄了被當(dāng)前執(zhí)行方法鎖定的對(duì)象(通過遍歷線程棧找到線程的鎖對(duì)象)

經(jīng)量級(jí)鎖加鎖前:

經(jīng)量級(jí)鎖加鎖后:

經(jīng)量級(jí)鎖的解鎖過程:

解鎖使用CAS來把displaced mark寫回對(duì)象的mark word中。

如果CAS失敗, 表示發(fā)生鎖競爭:則鎖膨脹。(通知其他等待線程鎖已釋放)

將鎖記錄空間置為0:如果發(fā)生鎖膨脹,則用0替換displaced mardk,如果不存在競爭,則CAS將鎖記錄空間置為0后,停止CAS操作。

偏向鎖

偏向鎖的引入:

在多處理器上CAS操作可能開銷很大。

大多數(shù)鎖不僅不存在競爭,而且往往由同一個(gè)線程使用。

使多帶帶一個(gè)線程獲取鎖的開銷更低。

代價(jià)是使另一個(gè)線程獲取鎖開銷增大。

偏向鎖加鎖過程:

當(dāng)鎖對(duì)象第一次被線程獲取時(shí),VM把對(duì)象頭中的標(biāo)志位設(shè)為101,即偏向模式。同時(shí)使用CAS把獲取到這個(gè)鎖的線程ID記錄在對(duì)象的mark word中,如果CAS成功,則持有偏向鎖的線程以后每次進(jìn)行這個(gè)鎖相關(guān)的同步塊時(shí),不再進(jìn)行任務(wù)同步操作,只進(jìn)行比較Mark word中的線程ID是否是當(dāng)前線程的ID。

偏向鎖的解鎖過程:

當(dāng)另外一個(gè)線程去嘗試獲取這個(gè)鎖時(shí),偏向模式結(jié)束。根據(jù)鎖對(duì)象目前是否處于被鎖定狀態(tài),撤銷偏向后恢復(fù)到未鎖定或經(jīng)量級(jí)鎖定狀態(tài)。

VM會(huì)停止持有偏向鎖的線程(實(shí)際上,VM不能停止單一線程,而是在安全點(diǎn)進(jìn)行的操作)。
遍歷持有偏向鎖的線程的棧,找到鎖記錄空間,將displaced mark 寫入到最舊的鎖記錄空間,其他的寫0。
更新鎖對(duì)象的mark word。如果被鎖定,則指向最舊的鎖記錄空間,否則,填入未鎖定值。

偏向鎖的特點(diǎn):

偏向于第一個(gè)獲取鎖的線程:

在mark word的Tag中增加一位

001表示無鎖狀態(tài)

101表示偏向或可偏向狀態(tài)(thread ID ==0 == unlock)

通過CAS來獲取偏向鎖

對(duì)于持有鎖的線程接下的鎖獲取和釋放開銷非常?。▋H僅判斷下,不需要CAS同步操作)。

如果另一個(gè)線程鎖定了偏向鎖對(duì)象,則偏向鎖收回,升級(jí)為輕量級(jí)鎖(增加了另一個(gè)線程獲取鎖的開銷)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/66060.html

相關(guān)文章

  • 后臺(tái)開發(fā)常問面試題集錦(問題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    spacewander 評(píng)論0 收藏0
  • 后臺(tái)開發(fā)常問面試題集錦(問題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    xfee 評(píng)論0 收藏0
  • 后臺(tái)開發(fā)常問面試題集錦(問題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    makeFoxPlay 評(píng)論0 收藏0
  • 淺談Java并發(fā)編程系列(五)—— ReentrantLock VS synchronized

    摘要:線程通過的方法獲得鎖,用方法釋放鎖。和關(guān)鍵字的區(qū)別在等待鎖時(shí)可以使用方法選擇中斷,改為處理其他事情,而關(guān)鍵字,線程需要一直等待下去。擁有方便的方法用于獲取正在等待鎖的線程。 ReentrantLock是Java并發(fā)包中一個(gè)非常有用的組件,一些并發(fā)集合類也是用ReentrantLock實(shí)現(xiàn),包括ConcurrentHashMap。ReentrantLock具有三個(gè)特性:等待可中斷、可實(shí)現(xiàn)...

    Ocean 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<