zoukankan      html  css  js  c++  java
  • 单例模式

    单例模式-LazyDoubleCheckSingleton(懒加载双重检查锁)

    public class LazyDoubleCheckSingleton {
        private static LazyDoubleCheckSingleton lazyDoubleCheckSingleton = null;
        private LazyDoubleCheckSingleton(){
    
        }
        public static LazyDoubleCheckSingleton getInstance(){
            if(lazyDoubleCheckSingleton == null){
                synchronized (LazyDoubleCheckSingleton.class){
                    if(lazyDoubleCheckSingleton == null){
                        lazyDoubleCheckSingleton = new LazyDoubleCheckSingleton();
                        //1.分配内存给这个对象
    //                  //3.设置lazyDoubleCheckSingleton 指向刚分配的内存地址
                        //2.初始化对象
    //                    intra-thread semantics
    //                    ---------------//3.设置lazyDoubleCheckSingleton 指向刚分配的内存地址
                    }
                }
            }
            return lazyDoubleCheckSingleton;
        }
    }

     以上的双重检查锁代码的缺点:

    1.会发生指定重排序

    //1.分配内存给这个对象
    //2.初始化对象
    //3.设置lazyDoubleCheckSingleton 指向刚分配的内存地址

    假设一种情况:

    两个线程同时访问对象,如果编译器优化之后,一个线程执行顺序为1.3.2,当线程1执行到3的时候,那么线程2执行生成对象的时候就会没有对象.

    解决办法关键字:Volatile

    1.保证共享内存的可见性。

    2.禁止指令重排序。

  • 相关阅读:
    jquery动画效果---animate()--滚屏
    一个前端的自我修养
    开发和测试
    jquery.find()
    c99和c++11的差异之一
    容器经典图
    C/C++中的##用法
    【心学.悟道】千圣皆过影,良知乃吾师
    memcpy, memset代码改写的方式
    三大软件原则
  • 原文地址:https://www.cnblogs.com/xujiangxi/p/11044976.html
Copyright © 2011-2022 走看看