美文网首页
为什么创建JAVA单例双重检查是不安全的

为什么创建JAVA单例双重检查是不安全的

作者: 一个菜鸟JAVA | 来源:发表于2019-03-11 17:10 被阅读1次
    示例代码
    public class Singleton {
        private static Singleton singleton;
    
        public static Singleton getInstance(){
            if (singleton == null){
                synchronized (Singleton.class){
                    if (singleton == null){
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    }
    
    原因:

    在代码执行到singleton = new Singleton();时,这一步会分解成3个步骤:

    • 1.分配内存空间
    • 2.创建对象
    • 3.singleton引用指向内存空间
    分析:

    正常的执行顺序是:1,2,3.但是因为指令排序的原因,有可能执行顺序是:1,3,2.
    当线程A执行了1,3后,让出时间片(时间片不是锁),这个时候线程B发现singleton不是null,直接返回,就会有问题.

    解决办法:

    volatile关键字修饰singleton防止指令重排序,那么执行顺序就必定是1,2,3了.

    相关文章

      网友评论

          本文标题:为什么创建JAVA单例双重检查是不安全的

          本文链接:https://www.haomeiwen.com/subject/govbpqtx.html