1. 启动时加载
1.1 - static new
1.2 - static class new
2. 延迟加载
2.1 - synchronized
2.2 - 双重锁检查 + volatile
2.3 - Java9中引入AtomicReference
3. 枚举实现
public class SingletonDemo {
//1. 启动时加载
// 1.1 - static new
// 1.2 - static class new
//2. 延迟加载
// 2.1 - synchronized
// 2.2 - 双重锁检查 + volatile
// 2.3 - Java9中引入AtomicReference
//3. 枚举实现
public static void main(String[] args) {
System.out.println(SingletonV11.getInstance() == SingletonV11.getInstance());
System.out.println(SingletonV12.getInstance() == SingletonV12.getInstance());
System.out.println(SingletonSynchronized.getInstance() == SingletonSynchronized.getInstance());
System.out.println(SingletonDoubleCheckVolatile.getInstance() == SingletonDoubleCheckVolatile.getInstance());
System.out.println(SingletonAtomicReference.getInstance() == SingletonAtomicReference.getInstance());
System.out.println(SingletonEnum.getInstance() == SingletonEnum.getInstance());
}
//1.1 - 启动时初始化单例
static class SingletonV11 {
private static final SingletonV11 singletonV11 = new SingletonV11();
private SingletonV11() {
System.out.println("SingletonV11()");
}
public static SingletonV11 getInstance() {
return singletonV11;
}
}
//1.2 - 启动时利用内部静态类初始化单例
static class SingletonV12 {
private static class SingletonHolder {
private static final SingletonV12 singletonV12 = new SingletonV12();
}
private SingletonV12() {
System.out.println("SingletonV12()");
}
public static SingletonV12 getInstance() {
return SingletonHolder.singletonV12;
}
}
//2.1 - synchronized版本,线程排队执行
static class SingletonSynchronized {
private static SingletonSynchronized singletonSynchronized = null;
private SingletonSynchronized() {
System.out.println("SingletonSynchronized()");
}
public synchronized static SingletonSynchronized getInstance() {
if (singletonSynchronized == null) {
singletonSynchronized = new SingletonSynchronized();
}
return singletonSynchronized;
}
}
//2.2 - 双重检查 + volatile
static class SingletonDoubleCheckVolatile {
private volatile static SingletonDoubleCheckVolatile singletonDoubleCheckVolatile = null;
private SingletonDoubleCheckVolatile() {
System.out.println("耗时长");
System.out.println("SingletonDoubleCheckVolatile()");
}
public static SingletonDoubleCheckVolatile getInstance() {
if (singletonDoubleCheckVolatile == null) {
synchronized(SingletonDoubleCheckVolatile.class) {
if (singletonDoubleCheckVolatile == null) {
//调用构造函数可能会存在指令重排,使用volatile
singletonDoubleCheckVolatile = new SingletonDoubleCheckVolatile();
}
}
}
return singletonDoubleCheckVolatile;
}
}
//2.3 - Java9中使用AtomicReference,避免volatile使得指令的上下部分会指令重排
static class SingletonAtomicReference {
private static AtomicReference singletonAtomicReference = new AtomicReference<>();
private SingletonAtomicReference() {
System.out.println("耗时长");
System.out.println("SingletonAtomicReference()");
}
public static SingletonAtomicReference getInstance() {
var localRef = singletonAtomicReference.getAcquire();
if (localRef == null) {
synchronized (SingletonAtomicReference.class) {
localRef = singletonAtomicReference.getAcquire();
if (localRef == null) {
singletonAtomicReference.setRelease(new SingletonAtomicReference());
localRef = singletonAtomicReference.getAcquire();
}
}
}
return localRef;
}
}
//3. 枚举实现,避免使用反射机制构造其他实例
static enum SingletonEnum {
INSTANCE;
public static SingletonEnum getInstance() {
return INSTANCE;
}
}
}