Enum关键字实现
public Enum EnumSingleton {
INSTANCE
}
是最简单的实现
类加载的时候就实例化
public class EarlyInitSingleton{
private final static EarlyInitSingleton earlyInitSingleton = new EarlyInitSingleton();
public EarlyInitSingleton getInstance() {
return earlyInitSingleton;
}
}
在类加载的时候就已经初始化了,简单省事的,唯一就是会造成空间浪费,因为都还没用就已经占位置了,不过,这点内存实际上来说不大。
双重验证
public class DoubleCheckSingleton{
private static volatile DoubleCheckSingleton instance;
public static DoubleCheckSingleton getInstance() {
if(instance == null) {
synchronized(DoubleCheckSingleton.class) {
if(instance == null) {
instance = new DoubleCheckSingleton();
}
}
}
return instance;
}
}
缺点:
- volatile关键字只有在java1.4之后才支持(基本不是什么大问题)
- 可读性非常差
- 必须使用volatile是因为保证内存可见性,不然,B线程使用本地的缓存,而A线程已经更新变量,B没看到,就会继续创建一个新实例
使用内部静态类实现懒加载
public class LazyInitInstance {
private static class B {
private final static LazyInitInstance INSTANCE = new LazyInitInstance();
}
public static LazyInitInstance getInstance() {
return B.instance;
}
}
第一次调用getInstance方法的时候才会初始化这个内部类
网友评论