2016-11-19 69 views
1

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,如果存在於本地的處理器高速緩存的對象圖,將被刷新到主內存。同時,將其他處理器本地緩存的相應緩存行標記爲無效。

是這樣嗎?裝配看起來如何?他們如何實際執行它?

回答

2

是這樣嗎?

實際保證的是,可以看到使用該構造函數創建的CC一個實例任何線程保證看到的mutable參考,也Mutable對象的字段作爲該構造完成時的狀態。

它不保證在Mutable實例的關閉中的所有值的狀態都將可見。但是,在構造函數完成之前執行構造函數的線程所做的任何寫操作(在閉包中或不在)中將會看到。 (通過「發生之前」分析。)

請注意,行爲是按照一個線程保證看到的而不是緩存刷新/無效的方式指定的。後者是實現規範要求的行爲的一種方式。可能有其他方法。

它在裝配中看起來像什麼?

這將是版本/平臺/等特定的。如果您想調查硬件的本機代碼的外觀,有一種方法可以讓JIT編譯器轉儲出編譯好的代碼。

他們如何真正落實呢?

參見上文。

+0

海報詢問有關'對象圖上的'值'final'的可見性保證。你說這些保證沒有擴展到'閉包中的值',但[另一個答案](https://stackoverflow.com/a/2830895/2402790)表示他們*擴展到對象圖上的值。 –

+0

他錯了。 (或者正確的...但是這個例子是/假設是不同的。)它取決於哪個線程寫入這些值。我的原始陳述沒有假設哪個線程(最後一個)寫入圖形/閉包中的對象。無論如何,我已經澄清了它。 –