【轉】深刻理解Java內存模型(五)——鎖

鎖的釋放-獲取創建的happens before 關係

鎖是java併發編程中最重要的同步機制。鎖除了讓臨界區互斥執行外,還可讓釋放鎖的線程向獲取同一個鎖的線程發送消息。java

下面是鎖釋放-獲取的示例代碼:編程

class MonitorExample {
    int a = 0;

    public synchronized void writer() {  //1
        a++;                             //2
    }                                    //3

    public synchronized void reader() {  //4
        int i = a;                       //5
        ……
    }                                    //6
}

假設線程A執行writer()方法,隨後線程B執行reader()方法。根據happens before規則,這個過程包含的happens before 關係能夠分爲兩類:併發

 
  1. 根據程序次序規則,1 happens before 2, 2 happens before 3; 4 happens before 5, 5 happens before 6。
  2. 根據監視器鎖規則,3 happens before 4。
  3. 根據happens before 的傳遞性,2 happens before 5。

上述happens before 關係的圖形化表現形式以下:app

在上圖中,每個箭頭連接的兩個節點,表明了一個happens before 關係。黑色箭頭表示程序順序規則;橙色箭頭表示監視器鎖規則;藍色箭頭表示組合這些規則後提供的happens before保證。線程

轉自:http://www.infoq.com/cn/articles/java-memory-model-5&同步

相關文章
相關標籤/搜索