1_基礎(chǔ)知識(shí)_chapter03_對(duì)象的共享_5_安全發(fā)布

  • (1) Java內(nèi)存模型為不可變對(duì)象的共享提供了特殊的初始化安全性保證, 即使在發(fā)布這些對(duì)象時(shí)沒(méi)有同步

    (2) 在沒(méi)有額外同步的情況下, 也可以保證安全訪問(wèn)final類(lèi)型的域(但是如果final類(lèi)型的域所指向的是可變對(duì)象, 還是需要同步)

  • 一個(gè)正確構(gòu)造的對(duì)象, 可以通過(guò)以下方式安全發(fā)布

    (1) 靜態(tài)初始化函數(shù)中初始化一個(gè)對(duì)象引用

    JVM內(nèi)部存在的同步機(jī)制保證

    (2) 將對(duì)象的引用保存到volatile類(lèi)型的域或者AtomicReference對(duì)象中

    (3) 將對(duì)象的引用保存到某個(gè)正確構(gòu)造對(duì)象的final類(lèi)型域中

    (4) 將對(duì)象的引用保存到一個(gè)由鎖保護(hù)的域中

    (將對(duì)象放入到某個(gè)帶鎖的容器例如Vector, synchronizedList再發(fā)布也屬于這種情形)

    所有的安全發(fā)布機(jī)制都能確保, 當(dāng)對(duì)象的引用對(duì)所有訪問(wèn)該對(duì)象的線程可見(jiàn)時(shí), 對(duì)象發(fā)布時(shí)的狀態(tài)對(duì)于所有線程也將是可見(jiàn)的。如果對(duì)象狀態(tài)不再改變, 那么足以確保任何訪問(wèn)都是安全的

  • 事實(shí)不可變對(duì)象

    (1) 如果對(duì)象從技術(shù)上看可變, 但是其狀態(tài)從發(fā)布后不會(huì)再改變, 則這種對(duì)象稱為事實(shí)不可變對(duì)象(例如java.util.Date類(lèi))

    (2) 在沒(méi)有額外的同步的情況下, 任何線程都可以安全的使用被安全發(fā)布的事實(shí)不可變對(duì)象

  • 可變對(duì)象

    不僅在發(fā)布時(shí)需要使用同步, 每次對(duì)象訪問(wèn)時(shí)也要使用同步來(lái)確保后續(xù)修改操作的可見(jiàn)性

    示例

      public class Holder {
    
          private int n;
    
          public Holder(int n) {
    
              this.n = n;
          }
    
          public void assertSanity() {
    
              if (n != n) {
                  throw new AssertionError("This statement is false.");
              }
          }
      }
    

    在多線程環(huán)境下, Holder很可能沒(méi)有被正確發(fā)布, 造成某個(gè)線程中未必看到其他線程構(gòu)造好的n的值, 從而造成AssertionError; 如果將n用final修飾, 則可以避免這個(gè)問(wèn)題

  • 對(duì)象的發(fā)布需求

    不可變對(duì)象: 任意機(jī)制發(fā)布

    事實(shí)不可變對(duì)象: 安全發(fā)布方式(4種)

    可變對(duì)象: 由某個(gè)鎖保護(hù)發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容