简单了解单例模式
// 1.线程不安全
class Singleton02 {
private static volatile Singleton02 instance = null;//声明对象,不实例化
public static Singleton02 getInstance(){//向外提供访问该类对象的方法
if (instance == null){
instance = new Singleton02();
}
return instance;
}
}
// 2.double-check锁保证线程安全
class Singleton02 {
// 由于锁已经保证了可见性,这里volatile的作用是防止new过程中的指令重排
private static volatile Singleton02 instance = null;//声明对象,不实例化
public static Singleton02 getInstance(){//向外提供访问该类对象的方法
if (instance == null){
synchronized(Singleton02.class){
if(instance == null){
instance = new Singleton02();
}
}
}
return instance;
}
}
// 3.CAS实现无锁线程安全创建单例
public class Singleton02 {
private static AtomicReference<Singleton02> instanceRef = new AtomicReference();
public static Singleton02 getInstance() {//向外提供访问该类对象的方法
// CAS配合自旋,CAS有volatile的语义,AtomicReference的实现是value用volatile修饰
for (; ; ) {
Singleton02 instance = instanceRef.get();
if (instance != null) return instance;
instanceRef.compareAndSet(null, new Singleton02());
}
}
}