Volatile\synchronized \local總結

1 、Volatile關鍵字與synchronized在內存的區別

volatile是變量修飾符,而synchronized則作用於一段代碼或者方法。

volatile只是在線程內存和main memory(主內存)間同步某個變量的值

synchronized通過鎖定和解鎖某個監視器同步所有變量的值。顯然synchronized要比volatile消耗更多資源。

2、synchronized 原理

常用的有以下三種使用方式:

  • 修飾代碼塊,即同步語句塊,其作用的範圍是大括號{}括起來的代碼,作用的對象是調用這個代碼塊的對象。
  • 修飾普通方法,即同步方法,其作用的範圍是整個方法,作用的對象是調用這個方法的對象。
  • 修飾靜態方法,其作用的範圍是整個靜態方法,作用的對象是這個類的所有對象

實現原理: JVM 是通過進入、退出 對象監視器(Monitor) 來實現對方法、同步塊的同步的,而對象監視器的本質依賴於底層操作系統的 互斥鎖(Mutex Lock) 實現。

具體實現是在編譯之後在同步方法調用前加入一個monitor.enter指令,在退出方法和異常處插入monitor.exit的指令。

對於沒有獲取到鎖的線程將會阻塞到方法入口處,直到獲取鎖的線程monitor.exit之後才能嘗試繼續獲取鎖。

Volatile\\synchronized \\local總結

流程圖

synchronized 特點

Volatile\\synchronized \\local總結

synchronized 特點

3、local

java提供了兩種方式來加鎖,一種是關鍵字:synchronized,一種是concurrent包下的lock鎖。synchronized是java底層支持的,而concurrent包則是jdk實現

  • lock的存儲結構:一個int類型狀態值(用於鎖的狀態變更),一個雙向鏈表(用於存儲等待中的線程)
  • lock獲取鎖的過程:本質上是通過CAS來獲取狀態值修改,如果當場沒獲取到,會將該線程放在線程等待鏈表中。
  • lock釋放鎖的過程:修改狀態值,調整等待鏈表。


分享到:


相關文章: