单例模式的写法
2018-08-01 本文已影响0人
皮皮咕
普通懒汉模式--非线程安全
public class SingletonExample1 {
// 私有构造函数
private SingletonExample1() {}
// 单例对象
private static SingletonExample1 instance = null;
// 静态的工厂方法
public static SingletonExample1 getInstance() {
if (instance == null) {
instance = new SingletonExample1();
}
return instance;
}
}
普通饿汉模式--线程安全,但是若初始化过程比较复杂,则可能会浪费资源
public class SingletonExample2 {
// 私有构造函数
private SingletonExample2() {}
// 单例对象
private static SingletonExample2 instance = new SingletonExample2();
// 静态的工厂方法
public static SingletonExample2 getInstance() {
return instance;
}
}
加synchronized的懒汉模式--线程安全,但是加锁使得访问的速度变慢
public class SingletonExample3 {
// 私有构造函数
private SingletonExample3() {}
// 单例对象
private static SingletonExample3 instance = null;
// 静态的工厂方法
public static synchronized SingletonExample3 getInstance() {
if (instance == null) {
instance = new SingletonExample3();
}
return instance;
}
}
双重同步锁懒汉模式--非线程安全
public class SingletonExample4 {
// 私有构造函数
private SingletonExample4() {}
// 单例对象
private static SingletonExample4 instance = null;
// 静态的工厂方法
public static SingletonExample4 getInstance() {
if (instance == null) {
synchronized (SingletonExample4.class) {
if (instance == null) {
// memory = allocate(); //1.分配对象内存空间
// instance(memory); //2.初始化对象
// instance = memory; //3.设置instance指向刚分配的内存地址,此时instance!=null
// 指令重排机制会使该方法出现线程问题
instance = new SingletonExample4();
}
}
}
return instance;
}
}
加volatile双重同步锁懒汉模式--线程安全
public class SingletonExample4 {
// 私有构造函数
private SingletonExample4() {}
// 单例对象,volatile禁止指令重排
private volatile static SingletonExample4 instance = null;
// 静态的工厂方法
public static SingletonExample4 getInstance() {
if (instance == null) {
synchronized (SingletonExample4.class) {
if (instance == null) {
instance = new SingletonExample4();
}
}
}
return instance;
}
}
枚举--推荐使用
public class SingletonExample7 {
// 私有构造函数
private SingletonExample7() {}
// 获取实例
public static SingletonExample7 getInstance() {
return Singleton.INSTANCE.getInstance();
}
// 枚举
private enum Singleton {
INSTANCE;
private SingletonExample7 singleton;
// JVM保证这个方法绝对只调用一次
Singleton() {
singleton = new SingletonExample7();
}
public SingletonExample7 getInstance() {
return singleton;
}
}
}