/**
* DCL(DubleCheckedLock)单例模式
*/
public class Singleton {
private volatile static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {//锁细化
synchronized (Singleton.class) {
if (instance == null) {//多线程环境下还需要再次判空
instance = new Singleton();
}
}
}
return instance;
}
}
volatile关键字的作用是禁止指令重排序优化。
分享一个介于牛A和牛C之间的单例模式,秒杀其他一切单例模式:
public enum EasySingleton {
INSTANCE;
}
通过EasySingleton.INSTANCE访问,线程安全而且还能防止反序列化导致重新创建新的对象。
不禁感叹,Java原来也可以如此优美!