一、目錄

1.啟蒙知識預(yù)熱:CAS原理+JVM對象頭內(nèi)存存儲結(jié)構(gòu)

2.JVM中鎖優(yōu)化:鎖粗化、鎖消除、偏向鎖、輕量級鎖、自旋鎖。

3.總結(jié):偏向鎖、輕量級鎖,重量級鎖的優(yōu)缺點。

 

二、啟蒙知識預(yù)熱

開啟本文之前先介紹2個概念

2.1.cas操作

為了提高性能,JVM很多操作都依賴CAS實現(xiàn),一種樂觀鎖的實現(xiàn)。本文鎖優(yōu)化中用到了CAS,故有必要先分析一下CAS的實現(xiàn)。

CAS:Compare and Swap。

JNI來完成CPU指令的操作:

unsafe.compareAndSwapInt(this, valueOffset, expect, update);

CAS有3個操作數(shù),內(nèi)存值V,舊的預(yù)期值A(chǔ),要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時,將內(nèi)存值V修改為B,否則什么都不做。

打開源碼:openjdk\hotspot\src\oscpu\windowsx86\vm\ atomicwindowsx86.inline.hpp,如下圖:0

萬碼學(xué)堂,電腦培訓(xùn),計算機培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

os::is_MP()  這個是runtime/os.hpp,實際就是返回是否多處理器,源碼如下:

萬碼學(xué)堂,電腦培訓(xùn),計算機培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 

如上面源代碼所示(看第一個int參數(shù)即可),LOCK_IF_MP:會根據(jù)當(dāng)前處理器的類型來決定是否為cmpxchg指令添加lock前綴。如果程序是在多處理器上運行,就為cmpxchg指令加上lock前綴(lock cmpxchg)。反之,如果程序是在單處理器上運行,就省略lock前綴(單處理器自身會維護(hù)單處理器內(nèi)的順序一致性,不需要lock前綴提供的內(nèi)存屏障效果)。

 

2.2.對象頭

HotSpot虛擬機中,對象在內(nèi)存中存儲的布局可以分為三塊區(qū)域:對象頭(Header)、實例數(shù)據(jù)(Instance Data)和對齊填充(Padding)。 本文只講對象頭。 

HotSpot虛擬機的對象頭(Object Header)包括兩部分信息:

第一部分"Mark Word":用于存儲對象自身的運行時數(shù)據(jù), 如哈希碼(HashCode)、GC分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程ID、偏向時間戳等等.

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運,軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式