java 記憶體模型中的happen-before 是什麼?
阿新 • • 發佈:2018-11-14
happen-before 關係,是Java記憶體模型中保證多執行緒可見性的機制,也是對早期語言規範中含糊的可見性概念的一個精確定義。
它的具體表現形式,包括但遠不止測試我們直覺中的 synchronized、volatile、lock 操作順序等方面,例如:
- 執行緒記憶體執行的每個操作,都保證happen-before後邊的操作,這就保證了基本程式順序規則,這是開發者再書寫程式時的基本約定。
- 對於volatilte 變數,對它的寫操作,保證happen-before在隨後對該變數的讀取操作。
- 對於一個鎖的解鎖操作,保證happen-before加鎖操作。
- 物件構建完成,保證happen-before對於finalizer的開始動作。
- 甚至是類似執行緒內部操作的完成,保證happen-before其他Thread.join()的執行緒等。
這些happen-before關係是存在著傳遞性的,如果滿足a happen-before b 和 b happen-before c,那麼a happen-before c 也成立。
前面我一直用happen-before,而不是簡單說前後,是因為它不僅僅是對執行時間的保證,也包括對記憶體讀、寫順序的保證。僅僅是時鐘順序上的先後,並不能保證執行緒互動的可見性。
JMM 內部的實現通常是依賴於所謂的記憶體屏障,通過禁止某些重排序的方式,提供記憶體可見性保證,也就是實現各種happen-before規則。happen-before原則是JMM中非常重要的原則,它是判斷資料是否存在競爭、執行緒是否安全的主要依據,保證了多執行緒環境下的可見性。
下圖是happens-before與JMM的關係圖(摘自《Java併發程式設計的藝術》)