final在新的Jmm被從新定義,說說你對它的實現機制的瞭解?

    final用來實現不可變類,方法和變量的申明,即類不可被繼承,方法不可被重寫,變量不可被從新賦值。final實現了在不須要同步的狀況下便可以保證線程安全。可是須要注意的是,須要保證對象的構造函數完成後對final成員變量進行引入,即安全構造。編程

 

參考資料:數組

JSR133中文版.pdf 安全

聲明爲 final 的字段初始化一次後,在正常狀況下它的值不會再改變。final 字段的 詳細語義與普通字段稍有不一樣。尤爲是,編譯器有很大的自由,能將對 final 字段 的讀操做移到同步屏障以外,而後調用任意或未知的方法。一樣,也容許編譯器將 final 字段的值保存到寄存器,在非 final 字段須要從新加載的那些地方,final 字段 無需從新加載。函數

final 字段也容許編程人員在不須要同步的狀況下實現線程安全的不可變對象。一個 線程安全的不可變對象被全部線程都視爲不可變的,即便不可變對象的引用在線程間傳遞時存在數據爭用。這提供了安全保證,能夠防止不正確或惡意代碼誤用了不 可變類。線程

final 字段必須正確使用才能保證不可變。當對象的構造器執行結束,就認爲該對象 是徹底初始化了的。一個線程只有在看到某個對象引用以前,該對象就已經徹底初 始化了,才能保證這個線程能看到該對象正確初始化的 final 字段值。對象

final 字段的使用方式很簡單。在對象的構造器裏爲該對象的 final 字段賦值。不要 將正在建立過程當中的對象引用寫到一個其它線程能夠看到的地方,這會讓其它線程 在構造器還沒有執行結束時就能訪問該對象。若是遵循這個規則,當該對象被其它線 程看到時,這些線程老是能看到該對象 final 字段的正確值。且這些 final 字段所引 用的任意對象或數組的中的內容,至少是和 final 字段同樣的新(譯者注:final 字 段所引用的對象裏的字段或數組元素可能在後續還會變化,若沒有正確同步,其它 線程也許不能看到最新改變的值,但必定能夠看到徹底初始化的對象或數組被 final 字段引用的那個時刻的對象字段值或數組元素。)。繼承

相關文章
相關標籤/搜索