1. 程式人生 > >Java併發程式設計的藝術——volatile和synchronized實現原理

Java併發程式設計的藝術——volatile和synchronized實現原理

volatile

volatile變數修飾的共享變數進行寫操作時候,會多出lock字首指令。 lock字首指令在多核處理器下會引發一下兩件事情:

  • 將當前處理器快取行的資料寫回到系統記憶體。
  • 這個寫回記憶體的操作會使在其他CPU裡快取了該記憶體地址的資料無效。

總結下volatile的兩條實現原則:

  • Lock字首指令會引起處理器快取回寫到記憶體。
  • 一個處理器的快取回寫到記憶體會導致其他處理器的快取無效。

synchronized

JVM基於進入和退出Monitor物件來實現方法同步和程式碼塊同步,但兩者實現細節不一樣。 程式碼塊同步是使用monitorenter和monitorexit指令實現的,而方法同步是使用另一種方法來實現的,但是方法的同步可以使用這兩個指令來實現。

monitorenter指令是在編譯後插入到同步程式碼塊的開始位置,而monitorexit是插入到方法結束處和異常處,JVM要保證每個enter必須有對應的exit與之配對。任何物件都有一個monitor與之關聯,並且一個monitor被持有後,它將處於鎖定狀態。執行緒執行到monitorenter指令時,將會嘗試獲取物件所對應的monitor的所有權,即嘗試獲得物件的鎖。