单例模式:对外只能有一个对象(如任务管理器)
/**
* 单例模式:懒汉式套路基础上加入并发控制,保证在多线程环境下,对外存在一个对象
* 1、构造器私有化-->避免外部new对象
* 2、提供私有的静态属性-->存储对象的地址
* 3、提供公共的静态方法-->获取属性
*/
public class DoubleCheckedLocking {
//1、构造器私有化
private DoubleCheckedLocking() {
}
//3、提供公共的静态方法
public static DoubleCheckedLocking getInstance() {
//再次检测,避免不必要的同步
if(instance == null) {
synchronized (DoubleCheckedLocking.class) {
instance = new DoubleCheckedLocking();
}
}
return instance;
}
public static void main(String[] args) {
Thread t = new Thread(()-> {
System.out.println(DoubleCheckedLocking.getInstance());
});
t.start();
System.out.println(DoubleCheckedLocking.getInstance());
}
//2、提供私有的静态属性
//没有volatile其它线程可能因为happen-before访问一个没有初始化的对象
//(指令重排:在单线程环境下,new一个对象的时候,先返回对象的引用后完成对象的初始化是没问题的,
//但是在多线程环境下,如果先返回了引用,那么另外一个线程在执行上面的方法时由于判断insitance不为
//null,就会得到一个未经初始化的对象)
//volatile可以避免指令重排,保证了对象被初始化后才会返回引用
private volatile static DoubleCheckedLocking instance;
}