/*
1. 饿汉式:类初始化时,会立即加载该对象,线程天生安全,调用效率高。
2. 懒汉式: 类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象,具备懒加载功能。
3. 静态内部方式:结合了懒汉式和饿汉式各自的优点,真正需要对象的时候才会加载,加载类是线程安全的。
4. 枚举单例: 使用枚举实现单例模式 优点:实现简单、调用效率高,枚举本身就是单例,由jvm从根本上提供保障!避免通过反射和反序列化的漏洞, 缺点没有延迟加载。
5. 双重检测锁方式 (因为JVM本质重排序的原因,可能会初始化多次,不推荐使用)
不需延迟加载 饿汉枚举 延迟加载 静态内部类比懒汉式更优 实际饿汉
*/
class SingletonDemo1 { //饿汉式
private static final SingletonDemo1 singleton = new SingletonDemo1();
private SingletonDemo1() {
}
public static SingletonDemo1 getInstance() {
return singleton;
}
}
class SingletonDemo2 {//懒汉式 线程不安全
private static SingletonDemo2 singleton;
private SingletonDemo2() {
}
public static SingletonDemo2 getInstance() {
if (singleton == null)
singleton = new SingletonDemo2();
return singleton;
}
}
class SingletonDemo3 {//懒汉式 线程安全
private static SingletonDemo3 singleton;
private SingletonDemo3() {
}
public static synchronized SingletonDemo3 getInstance() {
if (singleton == null)
singleton = new SingletonDemo3();
return singleton;
}
}
class SingletonDemo4 { //饿汉式 变种
private static SingletonDemo4 singleton = null;
static {
singleton = new SingletonDemo4();
}
private SingletonDemo4() {
}
public static SingletonDemo4 getInstance() {
return singleton;
}
}
class SingletonDemo5 {//枚举
static enum ENUM {
INSTANCE;
private cn.day18.SingletonDemo5 singleton;
private ENUM() {
singleton = new cn.day18.SingletonDemo5();
}
public SingletonDemo5 getInstance() {
return this.singleton;
}
}
}
class SingletonDemo6 {//双重校验锁
private volatile static SingletonDemo6 singleton;
private SingletonDemo6() {
}
public static SingletonDemo6 getSingleton() {
if (singleton == null) {
synchronized (SingletonDemo6.class) {
if (singleton == null) {
singleton = new SingletonDemo6();
}
}
}
return singleton;
}
}
class SingletonDemo7 {//静态内部类
private static class SingletonHolder {
private static final SingletonDemo7 INSTSNCE = new SingletonDemo7();
}
private SingletonDemo7() {
}
public static final SingletonDemo7 getInstance() {
return SingletonHolder.INSTSNCE;
}