java多线程中的单例模式以及double checked(双重检查)

2020-05-14

0.double-checked locking设计实现单例模式

public class SingletonClass {   
  
  // 加volatile是为了防止JVM自动优化代码,并在多线程环境中出现一个线程去创建实例,并先把指针指向了那块内存(但还没有调用构造函数).
  // 另一个线程此时调用会发现 instance != null,但它还没有构造完成,如果此时使用了这个实例,那么程序会报错
  // (在JDK1.5之前,volatile是个关键字,但是并没有明确的规定其用途)
  // 在JDK 5之后,Java使用了新的内存模型。volatile关键字有了明确的语义 被volatile修饰的写变量不能和之前的读写代码调整,读变量不能和之后的读写代码调整!
  private volatile static SingletonClass instance = null;
  
  
  public static SingletonClass getInstance() {   
    if (instance == null) {   
      synchronized (SingletonClass.class) {   
        if (instance == null) {   
          instance = new SingletonClass();   
        }   
      }   
    }   
    return instance;   
  }   
  
  private SingletonClass() {   
  
  }   
  
}

1.jdk 1.5以前的版本可以用的单例方法 推荐这种方法

public class SingletonClass {   
    
 private static class SingletonClassInstance {   
 private static final SingletonClass instance = new SingletonClass();   
 }   
    
 public static SingletonClass getInstance() {   
 return SingletonClassInstance.instance;   
 }   
    
 private SingletonClass() {   
    
 }   
    
}

标题:java多线程中的单例模式以及double checked(双重检查)
作者:kiwi-Xu
地址:https://xuwj.net/articles/2020/05/14/1589389094106.html