单例模式简介。
单例模式
法1
public class Singleton {
// 懒汉式——实例私有静态化,构造函数私有化,线程不安全
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
法2
public class Singleton {
// 较前者加了同步,但是效率极低,不适用
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
法3
public class Singleton {
// 饿汉式——基于classloder机制避免多线程同步,不能确定有其他的方式(或者其他的静态方法)导致类装载,也没有实现延迟加载
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
法4
public class Singleton {
// 饿汉式变种,差别不大
private Singleton instance = null;
static {
instance = new Singleton();
}
private Singleton (){}
public static Singleton getInstance() {
return this.instance;
}
}
法5
public class Singleton {
// 静态内部类——同样利用了classloder的机制来保证初始化instance时只有一个线程。
// 和法3法4不同的是,不主动调用getInstance(),不会装载内部类,从而达到了延迟加载。
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
法6
public enum Singleton {
// 枚举法,强无敌——不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
INSTANCE;
public void whateverMethod() {
}
}
法7
public class Singleton {
// 双重检验锁——懒汉式+volatile+类锁。缺点为无法防御反序列化。
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
参考:
http://www.hollischuang.com/archives/205
序列化破坏单例模式
http://www.hollischuang.com/archives/1144