核心
严谨起见,私有构造必须要加,避免外部创建新的实例
特性
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
常用的几种单例模式写法
- 懒汉方式
- 双重锁方式
- 静态类方式
每种方式对应的特性
方式 线程是否安全
懒汉方式 不安全
双重锁方式 安全(同步锁)
静态类方式 安全(静态类)
懒汉方式
private static SingleInstance singleInstance;
private SingleInstance (){}
public static SingleInstance getInstance(){
if (singleInstance == null) {
singleInstance = new SingleInstance();
}
return singleInstance;
}
线程不安全,如果多线程第二种比较合适
双重锁方式
private volatile static SingleInstance singleInstance;
private SingleInstance (){}
public static SingleInstance getInstance(){
if (singleInstance == null) {
synchronized (SingleInstance.class) {
if (singleInstance == null) {
singleInstance = new SingleInstance();
}
}
}
return singleInstance;
}
这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
因为这里用到了了volatile和synchronized
静态类方式
public static SingleInstance getInstance() {
return SingleInstanceS.INSTANCE;
}
private static class SingleInstanceS {
private static SingleInstance INSTANCE = new SingleInstance();
}
静态类方式 只有在要明确实现 lazy loading 效果时,才比较适合