zoukankan      html  css  js  c++  java
  • 单例模式下的双重检查锁DCL

    懒汉式的单例加入synchronized 虽然保证线程安全但效率低
    就有了双重检查锁DCL(double checked locking)机制实现单例提升效率
    双重检查锁就是在synchronized 前后加入if判断
    public static Singleton getInstance() {
      if (singleton == null) {
        synchronized (Singleton.class) {
          if (singleton == null) {
            singleton = new Singleton();
          }
        }
      }
      return singleton;
    }

    java中创建一个对象分解成三行伪代码
    //1:分配对象的内存空间
    memory = allocate();
    //2:初始化对象
    ctorInstance(memory);
    //3:设置instance指向刚分配的内存地址
    instance = memory;

    JMM中有提到计算机为了提升运行效率做到最优会对编译器或处理器的指令进行重排序
    以上 2、3中顺序有可能打乱情况下 线程A设置好对应的实例对象引用地址后 线程B在IF后发现实例对象不为null 获得一个未初始化的对象则无法获得锁了 在多线程下并不安全。
    怎样让他变的安全呢?当然就是volatile的内存屏障来防止重排序

    群交流(262200309)
  • 相关阅读:
    洛谷1020导弹拦截
    bzoj2467生成树
    qhfl-2 ContentType组件
    qhfl-1 跨域
    drf8 解析器
    drf7 分页组件
    drf6 权限和频率控制组件
    Flex 布局教程:语法篇
    2017年最新cocoapods安装教程(解决淘宝镜像源无效以及其他源下载慢问题)
    git命令行
  • 原文地址:https://www.cnblogs.com/webster1/p/13801374.html
Copyright © 2011-2022 走看看