我正在閱讀《Java 并發實踐》一書。在閱讀有關 JMM 的章節時,它說:JMM 為程序中的所有操作定義了一個名為“happens-before”的部分排序。為了保證執行動作B的線程可以看到動作A的結果(無論A和B是否發生在不同的線程中), A和B之間必須存在happens-before關系。但是,我無法使用任何“發生前”規則來派生“初始化安全”規則:初始化安全保證對于正確構造的對象,所有線程都將看到構造函數設置的最終字段的正確值,無論對象如何發布。我們可以使用happens-before規則來推導“初始化安全”規則,還是這兩個概念只是同一級別的抽象?
1 回答

30秒到達戰場
TA貢獻1828條經驗 獲得超6個贊
“初始化安全規則”是一種特殊的規則,不能從其他的happens-before關系中推導出來,也不能與其他的happens-before關系結合起來派生出更多的規則。
該規則在JLS §17.5 最終字段語義中指定:
final
字段還允許程序員無需同步即可實現線程安全的不可變對象。線程安全的不可變對象被所有線程視為不可變,即使使用數據爭用在線程之間傳遞對不可變對象的引用也是如此。這可以提供安全保證,防止錯誤或惡意代碼濫用不可變類。final
必須正確使用字段以保證不變性。
該章太長,無法完整引用,但我想強調這一具體聲明:
此happens-before排序不會與其他happens-before排序傳遞地關閉。
因此,除了其他先發生關系之外,還存在“初始化安全規則”,以幫助構建不可變對象。
添加回答
舉報
0/150
提交
取消