Synchronize 偏向鎖,輕量級鎖升級和撤銷過程,對象頭的變化


(鎖源碼文件: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();
 
    }
 
}
View Code

 

 最終打印結果:
    
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

 

 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM