Java并发编程实战~不安全的单例
生活随笔
收集整理的這篇文章主要介紹了
Java并发编程实战~不安全的单例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
不安全的單例
/*** 不安全的單例.<br>* @author gqltt<br>* @version 1.0.0 2020年4月7日<br>* @see * @since JDK 1.5.0*/ public class Singleton {// volatile 修飾保證安全.private static Singleton instance = null;public static Singleton getInstance() {// 如果線程A在執行2后切換,線程B進來---bugif(null == instance) {synchronized (Singleton.class) {if(null == instance) {// new的順序指令可能導致bug//1、初始化一塊內存M//2、instance指向內存&M//3、創建對象instance = new Singleton();}}}return instance;} }new 順序
?
問題
出在 new 操作上,我們以為的 new 操作應該是:
1、分配一塊內存 M;
2、在內存 M 上初始化 Singleton 對象;
3、然后 M 的地址賦值給 instance 變量。
但是實際上優化后的執行路徑卻是這樣的:
1、分配一塊內存 M;
2、將 M 的地址賦值給 instance 變量;
3、最后在內存 M 上初始化 Singleton 對象。
解決
instance改為volatile或者final
總結
以上是生活随笔為你收集整理的Java并发编程实战~不安全的单例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ant 简单示例+环境变量配置说明
- 下一篇: Java消息服务思维导图笔记