Java final關鍵字在緩存方面的行爲是什麼?關於緩存的Java final關鍵字語義
引自:jsr133-faq
爲對象的最終字段中的值在構造函數中進行設置。 假設對象構造「正確」,一旦構建了一個對象 ,分配給構造函數 中最後一個字段的值將對所有其他線程都可見,而不會與 同步。此外,任何其他對象 或由這些最終字段引用的數組的可見值至少與最終字段一樣爲 。
我不明白它是指當它說as up-to-date as the final fields
:
此外,對於那些最終字段引用的任何其他對象或數組 可見值將至少爲最新的最終字段爲 。
我的猜測是,例如:
public class CC{
private final Mutable mutable; //final field
private Other other; //non-final field
public CC(Mutable m, Other o){
mutable=m;
other=o;
}
}
當構造CC恢復,除了的mutable
指針值,所有的值上植根於m
,如果存在於本地的處理器高速緩存的對象圖,將被刷新到主內存。同時,將其他處理器本地緩存的相應緩存行標記爲無效。
是這樣嗎?裝配看起來如何?他們如何實際執行它?
海報詢問有關'對象圖上的'值'final'的可見性保證。你說這些保證沒有擴展到'閉包中的值',但[另一個答案](https://stackoverflow.com/a/2830895/2402790)表示他們*擴展到對象圖上的值。 –
他錯了。 (或者正確的...但是這個例子是/假設是不同的。)它取決於哪個線程寫入這些值。我的原始陳述沒有假設哪個線程(最後一個)寫入圖形/閉包中的對象。無論如何,我已經澄清了它。 –