volicate、單例模式、jvm內存模型聯(lián)系

面試中,面試官問起單例模式時,我們是否只乖乖地回答了七種單例模式呢

七種單例模式實現(xiàn)

在單例模式的懶漢模式(線程安全實現(xiàn))中,為什么需要更進一步地改為DCL(Double check)?這里其實涉及到Singleten對象在創(chuàng)建時的指令重排序問題。

Singleton = new Singleton();

抽象為jvm指令為

memory = allocate();    //1:分配對象的內存空間
initInstance(memory);    //2:初始化對象
instance = memory;        //3:設置instance指向剛分配的內存地址

因為2、3指令并不互相依賴,jvm可能把指令優(yōu)化為

memory = allocate();    //1:分配對象的內存空間
instance = memory;        //3:設置instance指向剛分配的內存地址
initInstance(memory);    //2:初始化對象

而volicate又是怎么防止指令重排序的呢?

答:volatile關鍵字通過“內存屏障”來防止指令被重排序。

下面是基于保守策略的JMM內存屏障插入策略:

在每個volatile寫操作的前面插入一個StoreStore屏障。
在每個volatile寫操作的后面插入一個StoreLoad屏障。
在每個volatile讀操作的后面插入一個LoadLoad屏障。
在每個volatile讀操作的后面插入一個LoadStore屏障。

關于內存屏障可以參考下文
內存屏障

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

相關閱讀更多精彩內容

  • 目錄: 1. 指令重排 2. 順序一致性 3. volatile 4. final 1.指令重排 要了解指令重排,...
    西部小籠包閱讀 902評論 0 1
  • 內存屏障是硬件之上、操作系統(tǒng)或JVM之下,對并發(fā)作出的最后一層支持。再向下是是硬件提供的支持;向上是操作系統(tǒng)或JV...
    猴子007閱讀 40,480評論 10 72
  • 一個簡單的單例示例 單例模式可能是大家經(jīng)常接觸和使用的一個設計模式,你可能會這么寫 publicclassUnsa...
    Martin說閱讀 2,402評論 0 6
  • 前言 Java內存模型(Java Memory Model,簡稱JMM),是針對Java在多線程并發(fā)下可能出現(xiàn)的各...
    juconcurrent閱讀 487評論 0 1
  • 除了充分利用計算機處理器的能力外,一個服務端同時對多個客戶端提供服務則是另一個更具體的并發(fā)應用場景。衡量一個服務性...
    胡二囧閱讀 1,462評論 0 12

友情鏈接更多精彩內容