废话不多说,直接撸代码
package JavaBasic;
/**
* @ClassName SingleTon
* @Deacription 高并发模式下的单列模式 双端检索机制DCL + volatile
* @Author caizeming
* @Date 2021/5/11 11:08
* @Version 3.0
*/
public class SingleTon {
public static volatile SingleTon instance = null;
private SingleTon(){
System.out.println("创建了一个实例");
}
public static /*synchronized*/ SingleTon getInstance() {//在方法上加同步,太笨重了
if (instance == null){//指令重拍可能出现走了instance = new SingleTon();,但实例并没有被初始化
synchronized (SingleTon.class) {
if (instance == null) {
instance = new SingleTon();//没有加volatile,在多核多线程下的会有cpu指令重排
}
}
}
return instance;
}
public static void main(String[] args) {
for(int i = 0; i<10;i++){
new Thread(()->{
getInstance();
}, String.valueOf(i)).start();
}
}
}
模拟了10个线程,下面是运行结果
可以看到,10个线程,构造方法只执行了一次。