多線程之 final

final 變量在併發當中,原理是通過禁止cpu的指令集重排序來提供線程的可見性,來保證對象的安全發佈,防止對象引用被其他線程在對象被完全構造完成前拿到並使用。

與鎖和volatile相比較,對final域的讀和寫更像是普通的變量訪問。對於final域,編譯器和處理器要遵守兩個重排序規則:

  1. 在構造函數內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變量,這兩個操作之間不能重排序。
  2. 初次讀一個包含final域的對象的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序。

與Volatile 有相似作用,不過Final主要用於不可變變量(基本數據類型和非基本數據類型),進行安全的發佈(初始化)。而Volatile可以用於安全的發佈不可變變量,也可以提供可變變量的可見性。

final 字段是必須在構造函數退出之前初始化完成。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章