一、目錄
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
os::is_MP() 這個是runtime/os.hpp,實際就是返回是否多處理器,源碼如下:
如上面源代碼所示(看第一個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、偏向時間戳等等.