Java——更巧妙的2种单例模式
传统的单例模式
- 饿汉模式
public class Singleton {
private static Singleton mInstance = new Singleton();
public static Singleton getInstance() {
return mInstance;
}
private Singleton() {
}
}
- 懒汉模式
public class Singleton {
// volatile防止优化器对指令重排序(会导致线程不安全)
// 原先创建顺序:1.对象版半始化 2.调用对象init方法,完成初始化 3.获取到对象
// JIT优化重排序后:1.对象版半始化 2.获取到对象 3.调用对象init方法,完成初始化
// 解释: 重排序后,获取到的对象是半初始化的对象,直接使用可能导致部分问题
private static volatile Singleton mInstance;
public static Singleton getInstance() {
if (mInstance == null) {
synchronized (Singleton.class) {
if (mInstance == null) {
mInstance = new Singleton();
}
}
}
return mInstance;
}
private Singleton() {
}
}
更巧妙的2种单例模式
- 类级内部类-实现单例模式
1. 相对于前面的懒汉模式来说,省去了synchronized
2. 利用JVM来保证线程安全性
3. lazy loading
public class Singleton {
private static class Inner {
private static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return Inner.instance;
}
private Singleton() {
}
}
- 枚举-实现单例模式
1. 《Effective Java》中被作者认为是实现Singleton的最佳方法
2. 简洁、安全、高效、序列化、防止实例化
3 利用了Enum的特性
public enum Singleton {
INSTANCE;
private Object object = new Object();
public Object getObject() {
return object;
}
}
测试(返回值为true)
public class Demo {
public static void main(String[] args) {
Object object1 = Singleton.INSTANCE.getObject();
Object object2 = Singleton.INSTANCE.getObject();
System.out.println(object1 == object2);
}
}