简单介绍
Ensure a class only has one instance, and provide a global point of access to it.
实现思路,一些关键点:
- 构造函数私有化防止new操作
- 提供全局访问点,未实例化时创建实例,已经实例化了直接返回
- 线程安全考虑,懒汉/饿汉模式考虑
- 其它奇技淫巧
饿汉模式
饿汉模式就是预先初始化的意思,不管系统有没有用到单例,在类加载的时候就初始化。
利用类加载机制:
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton () { }
public static Singleton getInstance() {
return instance;
}
}
利用枚举的特性:
a single-element enum type is often the best way to implement a singleton.
public class Singleton {
INSTANCE;
public void whateverMethod() {
}
}
懒汉模式
懒汉模式就是延迟初始化的意思,真正第一次要使用单例的时候才初始化。
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
可以使用synchronized关键字同步getInstance()方法保证线程安全:
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
使用双重检测锁优化,仅仅需要创建实例的时候同步:
public class Singleton {
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;
}
}
最后一种,利用类加载机制避免加锁,同样实现延迟初始化的效果:
public class Singleton {
private static class SingletonHolder{
private static final Singleton INSTSNCE = new Singleton();
}
private Singleton () {}
public static final Singleton getInstance () {
return SingletonHolder.INSTANCE;
}
}