美文网首页
懒汉单例模式多线程问题

懒汉单例模式多线程问题

作者: dwwl | 来源:发表于2020-05-21 18:01 被阅读0次

    单例模式:
    懒汉式在多线程下的可能被多次赋值的情况:

    LazySingleton.java

    public class LazySingleton {
        private static LazySingleton lazySingleton ;
    
        private LazySingleton() {
    
        }
    
        public static LazySingleton getInstance() {
            if (lazySingleton == null) {
                lazySingleton = new LazySingleton();
            }
            return lazySingleton;
        }
    }
    

    出现原因:可能会有多个线程同时通过 lazySingleton == null 判断条件,这样会同时对lazySingleton赋了两次值,在某些情况下可能会不被允许。解决方法:加同步锁,但是这样开销会比较大,于是有了双重检查的这种方式,但是注意添加volatile防止指令重排序,

    为什么双重检查锁模式需要 volatile ?

    不得不提的volatile及指令重排序(happen-before)

    文中介绍了除了双重检查模式 还可使用局部变量的方式

    双重检查方式

    public class LazySingleton {
        private static volatile LazySingleton lazySingleton ;
    
        private LazySingleton() {
    
        }
    
        public static LazySingleton getInstance() {
            if (lazySingleton == null) {
                synchronized (LazySingleton.class) {
                    if (lazySingleton == null) {
                        lazySingleton = new LazySingleton();
                    }
                }
            }
            return lazySingleton;
        }
    }
    

    相关文章

      网友评论

          本文标题:懒汉单例模式多线程问题

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