1. 程式人生 > >偏向鎖淺析

偏向鎖淺析

mem 耗時 https 內置 pri tsp 鎖機制 ase bsp

  偏向鎖不像自旋鎖、讀寫鎖或者synchronize修飾詞這樣的同步,它其實是JVM內置的一種鎖機制,自JDK1.6後默認啟用。換句話說,這種鎖不是咱程序員能用代碼來瞎操心的,JVM自己會去操心的。真想要瞎操心,就得改JVM的啟動參數。

  既然無需我們操心,那麽了解一下也是好的。偏向鎖偏向於第一個獲得它的線程,如果在接下來的執行過程中,該鎖沒有被其他的線程獲取,那麽持有偏向鎖的線程無需再進行同步。很明顯,當鎖的競爭情況很少出現時,偏向鎖就能提高性能,因為它比輕量級鎖(如自旋鎖)少了一步:CAS。如果鎖的競爭比較激烈,那麽偏向鎖並無太大用處。我們來看看,在自旋鎖和synchronize同步方法兩種情況下,偏向鎖的實際時延,這裏用的是jdk1.8版本。

  一、自旋鎖:代碼參見自旋鎖淺析的testSpinLock方法

  1、默認耗時:

count值:100000, 耗時:25毫秒.

  2、開啟偏向鎖,啟動默認五秒之後生效:-XX:+UseBiasedLocking

技術分享圖片

count值:100000, 耗時:32毫秒.

  3、開啟偏向鎖,立即生效:-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0

技術分享圖片

count值:100000, 耗時:120毫秒.

  二、synchronize同步方法:代碼參見,需要增加全局變量:

private long startTime = 0L;

  在before方法開始處加入該變量的賦值:

startTime = System.currentTimeMillis();

  再加上after方法:

    @After
    public void after()
    {
        System.out.printf("耗時:%d毫秒.\n", System.currentTimeMillis() - startTime);
    }

  1、默認耗時:

耗時:1076毫秒.

  2、開啟偏向鎖,啟動默認五秒之後生效:-XX:+UseBiasedLocking

技術分享圖片

耗時:1090毫秒.

  3、開啟偏向鎖,立即生效:-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0

技術分享圖片

耗時:1099毫秒.

偏向鎖淺析