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

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