java併發:synchronized的實現原理與應用

前言:

在多線程並發編程中synchronized一直是元老角色,很多人都會稱呼它重量級鎖。

先來看下利用synchronized實現同步的基Java中的每一個象都可以作爲鎖。具體表現 爲以下3種形式。

       ·對於普通同步方法,鎖是當前實例對象。

       ·對於靜態同步方法,鎖是當前類的Class對象。

       ·對於同步方法塊,鎖是Synchonized括號裏配置的對象。

當一個試圖訪問同步代碼塊時,它首先必得到,退出或拋出異常須釋。 那麼鎖到底存在哪裏呢?裏面會存什麼信息呢?

       SynchonizedJVM裏的實現原理: 

      JVM基於入和退出Monitor對象來實現方法同步和代碼塊同步,但兩者的實現細節不一碼塊同步是使用monitorentermonitorexit指令實現的,而方法同步是使用另外一種方式實現的,細節JVM範裏並沒有 詳細說明。但是,方法的同步同可以使用兩個指令來實現。 monitorenter指令是在編譯後插入到同步代碼塊開始位置,而monitorexit是插入到方法束處異常JVM要保每個monitorenter對應monitorexit與之配任何象都有一個monitor與之關,當且一個monitor被持有後,它將定狀行到monitorenter指令時,將會嘗試獲象所對應monitor的所有,即嘗試獲象的

 

1、Java對象頭

         synchronized用的是存在Java裏的。如果象是數組類型,機用3個字寬 (Word)存儲對,如果象是非數組類型,2儲對。在32位虛機中,1寬 等於4,即32bit,如表所示。

       Java對裏的Mark Word裏默儲對象的HashCode、分代年鎖標記位。32JVM 的Mark Word的默儲結構如表所示。

                                                                              對象頭存儲結構

 Mark Word可能變 化爲以下4種數據:

 

2、鎖的升級與對比

      Java SE 1.6爲了減少鎖帶來的性能消耗,引入了偏向級鎖,在 Java SE 1.6中,一共有4種狀級別從低到高依次是:無、偏向級鎖狀態和重量級鎖幾個狀會隨着爭情況逐可以升但不能降,意味着偏向鎖級鎖後不能降成偏向卻不能降的策略,目的是了提高獲得的效率,下文會詳細分析。

 2.1、偏向鎖

       大多數情況下,鎖不不存在多爭,而且是由同一線程多次得,讓線的代價更低而引入了偏向。當一個訪問同步並獲取鎖時,

  • 棧幀鎖記錄裏存儲鎖偏向的ID
  • 之後該線程在入和退出 同步塊時不需要CAS操作來加和解
  • 只需要簡單測試一下Mark Word裏是否 着指向當前程的偏向
  • 如果測試成功,表示程已經獲得了
  • 如果測試要再測試一下Mark Word中偏向標識是否置成1(表示當前是偏向
  • 如果沒有置,使用CAS;如果置了,則嘗試使用CAS的偏向指向當前程。

1)偏向的撤

      偏向鎖使用了一種等到爭出的機制,所以當其他嘗試競爭偏向鎖時, 持有偏向鎖程纔會。偏向的撤,需要等待全局安全點(在時間點上沒有正在執行的字節碼)。它會首先有偏向程,然後檢查持有偏向程是否活着, 如果線程不於活頭設置成無;如果程仍然活着,有偏向棧會被執行,遍偏向象的鎖記錄中的鎖記錄Mark Word要麼重新偏向於其他線程,要麼恢復到無或者標記對象不適合作偏向,最後停的程。下圖中的線程1演示了偏向初始化的流程,2演示了偏向的流程。

2)關偏向

        偏向鎖Java 6Java 7裏是默啓用的,但是它在用程序啓幾秒之後才激活,如 有必要可以使用JVM參數來關-XX:BiasedLockingStartupDelay=0。如果你確定用程 序裏所有的鎖通常情況下爭狀,可以通JVM參數關偏向-XX:- UseBiasedLocking=false,那麼程序默級鎖

2.2、 輕量級鎖

   (1級鎖

        線程在行同步之前,1.JVM會先在當前程的棧楨用於存儲鎖記錄,2.並將中的Mark Word複製到鎖記錄,官方稱Displaced Mark Word。3.然後嘗試使用CAS將中的Mark Word換爲指向鎖記錄的指。如果成功,當前,如果失敗,表示其他,當前程便嘗試使用自旋來

   (2級鎖

        輕鎖時,會使用原子的CAS操作將Displaced Mark Word回到,如果成功,則表示沒有生。如果失,表示當前存在爭,就會膨成重量級鎖2-2是 兩個線程同奪鎖的流程

    

因爲自旋會消耗CPU了避免無用的自旋(比如程被阻塞住了),一旦級成重量級鎖,就不會再恢復到級鎖。當鎖處個狀下,其他試圖獲鎖時,都會被阻塞住,當持有鎖之後會程,被醒的程就會行新一輪的奪鎖之爭。

3.鎖的優缺點對比

     鎖的優缺點對比如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章