美文网首页
单例模式的双层监测机制

单例模式的双层监测机制

作者: 姜小鱼Qyer | 来源:发表于2017-03-17 14:37 被阅读0次
class SingleTon {

  private static volatile SingleTon instance;

  private SingleTon() {
  }

  public SingleTon getInstance() {
  if(instance == null) {
    synchronized(SingleTon.class) {
      if(instance == null) {
        instance = new SingleTon();
      }
    }
  return instance;
  }
}

两次检测instance == null,一次在同步块外,一次在同步块内

** 为什么在同步块内还要再检验一次? **
因为可能会有多个线程一起进入同步块外的 if,如果在同步块内不进行二次检验的话就会生成多个实例了。

instance == new SingleTon()不是一句原子操作,JVM中对这句话的反应是下面三个:

  1. 给instance分配内存
  2. 调用SingleTon构造函数初始化成员变量
  3. 将instance对象指向分配的内存空间(执行完这一步instance变为非null)

但是在 JVM 的即时编译器中存在指令重排序的优化。也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是 1-2-3 也可能是 1-3-2。如果是后者,则在 3 执行完毕、2 未执行之前,被线程二抢占了,这时 instance 已经是非 null 了(指向的内存空间,但却没有初始化),所以线程二会直接返回 instance,然后使用,然后顺理成章地报错。
所以,需要将instance声明为volatile

有些人认为使用 volatile 的原因是可见性,也就是可以保证线程在本地不会存有 instance 的副本,每次都是去主内存中读取。但其实是不对的。使用 volatile 的主要原因是其另一个特性:禁止指令重排序优化。

相关文章

  • 单例模式的双层监测机制

    两次检测instance == null,一次在同步块外,一次在同步块内 ** 为什么在同步块内还要再检验一次? ...

  • Kotlin-单例类

    1、单例模式:设计模式之一,可以避免创建重复的对象。 2、单例模式工作机制Java写法: public class...

  • 单例模式

    理解单例模式 单例模式提供了这样一个机制,即确保类有且只有一个特定类型的对象,并提供全局访问点。因此,单例模式通常...

  • 单例模式

    单例模式 单例模式提供了这样一个机制,即确保类有且只有一个特定类型的对象,并提供全局访问点。 单例模式通常用于下列...

  • 我要做 Android 之单例模式

    Q:实现单例模式有几种方法?懒汉式中双层锁的目的是什么?两次判空的目的又是什么? 懒汉式(线程不安全) 单例模式最...

  • Java ClassLoader机制(源码级别) —从内部类单

    内部类单例是种很好的单例模式,利用ClassLoader 线程安全的加载模式 为了更好的理解类的加载机制,我们来深...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • Telegram开源项目之单例模式

    NotificationCenter的单例模式 NotificationCenter的单例模式分析 这种单例模式是...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

网友评论

      本文标题:单例模式的双层监测机制

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