单例设计模式总结
1、饿汉式
线程安全,比较常用,但容易产生垃圾,因为一开始就初始化
public class Singleton {
// 初始化一个
private static final Singleton INSTANCE = new Singleton();
// 别人不能new
private Singleton() {
}
// 保证别人能获取
public static Singleton getInstance() {
return INSTANCE;
}
}
2、懒汉式
线程不安全,延迟初始化,严格意义不是单例设计模式
public class Singleton {
// 初始化一个
private static Singleton INSTANCE;
// 别人不能new
private Singleton() {
}
// 保证别人能获取
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
3、内部类实现单例
public class Singleton {
// 别人不能new
private Singleton() {
}
// 获取实例
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
// 静态内部类
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
}
4、枚举实现单例设计模式
这种方法在功能上与公有域方法相近,但是它更加简洁,无偿提供了序列化机制,绝对防止多次实例化,即使是在面对复杂序列化或者反射攻击的时候。虽然这种方法还没有广泛采用,但是单元素的枚举类型已经成为实现Singleton的最佳方法。 ——《Effective Java中文版第二版》
public class Singleton {
// 别人不能new
private Singleton() {
}
// 保证别人能获取
public static Singleton getInstance() {
return SingletonHolder.INSTANCE.instant;
}
// 初始化一个
private enum SingletonHolder {
INSTANCE;
private final Singleton instant;
SingletonHolder() {
instant = new Singleton();
}
}
}
5、双重锁模式,双重检查(重点)
public class Singleton {
// volatile如果不加可能会出现半初始化的对象
private volatile static Singleton instance;
// 别人不能new
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}