1. 程式人生 > >Java 記憶體模型中的happens-before 原則

Java 記憶體模型中的happens-before 原則

1、happens-before 原則闡述了多執行緒之間的記憶體可見性。也就是說它是用來規定某個執行緒修改的變數在什麼時候對其它執行緒可見的。

happens-before 原則是判斷資料是否存在競爭、執行緒是否安全的主要依據,依靠這個原則,我們才能解決在併發環境下兩操作之間是否可能存在衝突的所有問題。

在JMM中,如果一個操作執行的結果需要對另一個操作可見,那麼這兩個操作之間必須存在happens-before關係。

2、happens-before原則定義如下:

  1. 如果一個操作happens-before另一個操作,那麼第一個操作的執行結果將對第二個操作可見,而且第一個操作的執行順序排在第二個操作之前。
  2. 兩個操作之間存在happens-before關係,並不意味著一定要按照happens-before原則制定的順序來執行。如果重排序之後的執行結果與按照happens-before關係來執行的結果一致,那麼這種重排序並不非法。

下面是happens-before原則規則:

  1. 程式次序規則:一個執行緒內,按照程式碼順序,書寫在前面的操作先行發生於書寫在後面的操作;
  2. 鎖定規則:一個unLock操作先行發生於後面對同一個鎖額lock操作;
  3. volatile變數規則:對一個變數的寫操作先行發生於後面對這個變數的讀操作;
  4. 傳遞規則:如果操作A先行發生於操作B,而操作B又先行發生於操作C,則可以得出操作A先行發生於操作C;
  5. 執行緒啟動規則:Thread物件的start()方法先行發生於此執行緒的每個一個動作;
  6. 執行緒中斷規則:對執行緒interrupt()方法的呼叫先行發生於被中斷執行緒的程式碼檢測到中斷事件的發生;
  7. 執行緒終結規則:執行緒中所有的操作都先行發生於執行緒的終止檢測,我們可以通過Thread.join()方法結束、Thread.isAlive()的返回值手段檢測到執行緒已經終止執行;
  8. 物件終結規則:一個物件的初始化完成先行發生於他的finalize()方法的開始;