1 饿汉模式
顾名思义,就是比较饥饿。立马创建对象,没有延迟加载。
public class HungrySingle {
private static HungrySingle instance;
private HungrySingle() {}
static {
instance=new HungrySingle();
}
public static HungrySingle getInstance() {
return instance;
}
}
2 懒汉模式
延迟创建对象
public class LazySingle {
private static volatile LazySingle instance;
private LazySingle() {}
/**
* 双重检查锁定
* 注意:如果不使用双重检查锁定,那么对象不会实现一次性的安全发布。
* 在if(instance==null)的时候,A线程创建了一个对象,但是一般的JVM会进行JIT优化,
* 开辟新空间,引用指向JVM的内存区域,但是没有实例化,只是引用,此时B线程发现引用
* 已经存在,认为创建了对象,会直接返回,但是返回的是空引用
* @return
*/
public static LazySingle getInstance() {
if(instance==null) {
synchronized (LazySingle.class) {
instance=new LazySingle();
}
}
return instance;
}
}
3 静态内部类
public class StaticInnerClassSingle {
private StaticInnerClassSingle() {}
private static class Singleton {
private static final StaticInnerClassSingle INSTANCE=new StaticInnerClassSingle();
}
public static StaticInnerClassSingle getInstance() {
return Singleton.INSTANCE;
}
}
4 枚举
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}