雙重檢查鎖定和延遲初始化

2021-08-28 21:21:08 字數 975 閱讀 8132

在多執行緒程式中,有時候我們需要採用延遲初始化來降低初始化類和建立物件的開銷

使用synchronized延遲初始化的弊端:使用synchronized降低效能開銷,如果該同步方法被多個執行緒頻繁呼叫,將會導致程式執行效能的下降

使用雙重檢查鎖定來延遲初始化的好處:

多個執行緒試圖在同一時間建立物件時,會通過加鎖來保證只有乙個執行緒建立物件

在物件建立好之後,執行getinstance()方法將不需要獲取鎖,直接返回一建立好的物件

有乙個錯誤的優化:**讀取到instance不為null時,instance引用的物件可能還沒有完成初始化

**7可以分解為一下三步:

其中步驟2,3可能會被重排序,因為不會改變單執行緒內的執行結果

但是在多執行緒中就會發生乙個執行緒訪問另乙個執行緒未被初始化的物件

解決方案:

不允許2,3重排序

允許2,3重排序,但不允許其他執行緒看到這個重排序

第一種方案只需要將instance設定為volatile型別的物件,就可以禁止2,3之間的重排序

優勢:除了可以對靜態字段實現延遲初始化外,還可以對例項字段實現延遲初始化

第二方案:(**簡潔)

適用於對靜態字段使用執行緒安全的延遲初始化

延遲初始化 beans

在預設情況下,而不是幾個小時甚至幾天後才發現這些錯誤。當這些行為不適合我們的時候,我們可以通過定義bean為延遲初始化阻止 singleton bean 的 pre instantiated 乙個延遲載入的bean會告訴ioc容器,第一次使用它的時候建立bean,而不是在啟動的時候建立。在xml檔案...

直接初始化和複製初始化

關於這個問題,國內外都有許多爭論,但我至今未找到滿意的答案,至於為為什麼,這就是今天要說明的。可能大家都有看過c primer,我看的是第四版,中文版,英文水平不怎麼樣。其中第13章,描述說,複製建構函式可用於 1.根據另乙個同型別的物件顯式或隱式初始化乙個物件 2.複製乙個物件,將它作為引數傳遞給...

靜態初始化和例項初始化

父類單獨的效果 當父類單獨執行時,靜態初始化塊優先執行,然後是例項初始化塊,最後才是構造器 子類單獨效果 首先執行父類的靜態初始化塊和子類的初始化塊 優先執行靜態 然後執行父類的例項初始化塊和構造器,最後執行子類的例項初始化塊和構造器 父類子類效果1 父在前子在後 先將父類的物件例項出來後,進行子類...