Java单例模式双重检查锁定中volatile关键字的作用
生活随笔
收集整理的這篇文章主要介紹了
Java单例模式双重检查锁定中volatile关键字的作用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先要說的是,個人推薦使用餓漢模式和靜態內部類方式實現單例模式。其實,靜態內部類里也是一個餓漢模式。
懶漢模式中,雙重檢查鎖定代碼如下:
volatile作用:以下會涉及到Java內存模型的知識
禁止指令重排序。我們知道new Singleton()是一個非原子操作,編譯器可能會重排序【構造函數可能在整個對象初始化完成前執行完畢,即賦值操作(只是在內存中開辟一片存儲區域后直接返回內存的引用)在初始化對象前完成】。而線程B在線程A賦值完時判斷instance就不為null了,此時B拿到的將是一個沒有初始化完成的半成品。
保證可見性。線程A在自己的工作線程內創建了實例,但此時還未同步到主存中;此時線程B在主存中判斷instance還是null,那么線程B又將在自己的工作線程中創建一個實例,這樣就創建了多個實例。
順便提一下,volatile禁止指令重排序只能保證volatile修飾的代碼之后的代碼不會在它之前執行。
總結
以上是生活随笔為你收集整理的Java单例模式双重检查锁定中volatile关键字的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程的控制
- 下一篇: Spring事务的处理流程、传播属性、及