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)
  • 相关阅读:
    通信收发单元
    WOSA协议(转)
    CcTalk (网络协议)(转)
    0x和H都表示十六进制有什么区别吗?
    select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)
    &是什么运算符(转)
    NDK的Paths and Symbols设定
    android JNI调用(转)
    scrapy-redis基础和介绍
    scrapy-redis介绍(一)
  • 原文地址:https://www.cnblogs.com/webster1/p/13801374.html
Copyright © 2011-2022 走看看