- 使用静态内部类实现单例
public class Something {
private Something() {}
private static class LazyHolder {
static final Something INSTANCE = new Something();
}
public static Something getInstance() {
return LazyHolder.INSTANCE;
}
}
src:Initialization-on-demand holder idiom lazy-loaded singleton in java
- 配合volatile的double check实现单例懒加载
注:instance = new Singleton()不是原子操作,原子分解:
- 分配Singleton空间,
new
- 初始化对象,
Singleton()
- 把对象地址赋值给instance,
instance =
如果没有volatile,其中2,3原子操作【有可能】出现指令重排,导致先执行3后,【a线程】挂起,instance不为null,但是所指向的内存空间没有对象的初始化(方法或属性的地址)
【b线程】得到instance 调用就会出错。
volatile 保证,会影响instance值的写操作的指令不会重排
public class Singleton {
private static volatile Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) {
synchronized(SingleInstance.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}