定义
保证一个类只能有一个实例,并提供一个全局访问点。
实现需要三个必要的条件
1、单例类的构造函数必须是私有的,即该类不能被继承
2、单例类通过一个私有的静态变量来存储其唯一实例
3、单例类通过提供一个公开的静态方法,使得外部使用者可以访问类的唯一实例
应用场景
重量级对象的创建,比如线程池,数据库链接池
示例代码
public class Singleton {
private volatile static Singleton instance; //volatile 关键字,禁止指令重排序
private Singleton () {}
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) { // 注意这里是类级别的锁
if (instance == null) { // 这里的检测避免多线程并发时多次创建对象
instance = new Singleton();
}
}
}
return instance;
}
}
优点: 1、线程安全
2、双重检测, 加锁优化
3、禁止指令重排序
4、初始化 给静态变量赋值