(鎖源碼文件:bytecodeInterpreter.cpp)
問題:
1 偏向鎖加鎖前,加鎖中,加鎖后頭變化
2 偏向鎖升級輕量級鎖,升級前,輕量鎖,和輕量級鎖完成對象頭變化
結論:
1 偏向鎖加鎖前,對象頭標識 101,沒有保存線程ID
2 偏向鎖加鎖 ,對象頭標識101,保存線程ID(1 當前線程中創建一個Lock Recode 2 所記錄中的指針指向對象頭)
3 偏向鎖加鎖后:對象頭標識101,保存線程ID,如果同一個線程過來請求則對比線程ID,線程還是偏向鎖
4偏向鎖鎖升級為輕量級鎖前:對象頭為101,存在線程ID ,第4步到5步驟偏向鎖升級,中間會有偏向鎖撤銷,然后才升級輕量鎖,這個會有性能損耗
5 輕量級鎖加鎖時候:對象頭000,保存線程鎖記錄的指針(1 創建鎖記錄 2 所記錄指針指向對象頭 3對象頭指針指向所記錄 )
6 輕量級鎖完成后:對象頭001,無線程ID和所記錄指針的保存
對於輕量級鎖釋放以后有新線程過來加鎖:
1 生成一個無鎖的markword(001)
2 將無鎖的markword 替換掉線程中的所記錄中的markword
3 用cas判斷對象頭中的markword標識的值和內存中生成的值(001)是否相同
4 如果相同,則將對象頭中的指針指向棧幀中的所記錄
5 如果不同,則可能是有新線程已經加鎖,則當前鎖需要膨脹為重量級鎖
6 將對象頭的標識為改成 00
測試代碼:

package com.test;//package com.test; import org.openjdk.jol.info.ClassLayout; import java.util.concurrent.locks.LockSupport; /** * Hello world! *-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode -XX:-UseCompressedOops 指針壓縮測試 * -Xms1g -Xmx1g -XX:+PrintGCDetails -XX:BiasedLockingStartupDelay=0 偏向延遲關閉參數 */ public class Test4 { static Thread t1=null; static Thread t2 = null; public static void main( String[] args ) throws InterruptedException { B b = new B(); t1 = new Thread(){ @Override public void run() { System.out.println( Thread.currentThread().getId()); System.out.println(ClassLayout.parseInstance(b).toPrintable()); synchronized (b){ System.out.println(ClassLayout.parseInstance(b).toPrintable()); } System.out.println(ClassLayout.parseInstance(b).toPrintable()); LockSupport.unpark(t2); } }; t2 = new Thread( ){ @Override public void run() { LockSupport.park(); System.out.println("線程2開始執行======"); System.out.println( Thread.currentThread().getId()); System.out.println(ClassLayout.parseInstance(b).toPrintable()); synchronized (b){ System.out.println(ClassLayout.parseInstance(b).toPrintable()); } System.out.println(ClassLayout.parseInstance(b).toPrintable()); } }; t1.start(); t2.start(); t1.join(); t2.join(); } }
最終打印結果:
com.test.B object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 05 c2 00 f8 (00000101 11000010 00000000 11111000) (-134168059) 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total com.test.B object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 05 b0 93 1e (00000101 10110000 10010011 00011110) (512995333) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 05 c2 00 f8 (00000101 11000010 00000000 11111000) (-134168059) 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total com.test.B object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 05 b0 93 1e (00000101 10110000 10010011 00011110) (512995333) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 05 c2 00 f8 (00000101 11000010 00000000 11111000) (-134168059) 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total 線程2開始執行====== 13 com.test.B object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 05 b0 93 1e (00000101 10110000 10010011 00011110) (512995333) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 05 c2 00 f8 (00000101 11000010 00000000 11111000) (-134168059) 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total com.test.B object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 10 f3 c3 1f (00010000 11110011 11000011 00011111) (532935440) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 05 c2 00 f8 (00000101 11000010 00000000 11111000) (-134168059) 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total com.test.B object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) 8 4 (object header) 05 c2 00 f8 (00000101 11000010 00000000 11111000) (-134168059) 12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total