标签:没有 void print pac 失败 asi read highlight vol
先来个单例模式的线程安全代码
package basic.single;
public class SingleTon {
private SingleTon(){
System.out.println(Thread.currentThread().getName());
}
private static volatile SingleTon singleTon;
/*public static SingleTon getInstance(){
if(singleTon == null){
synchronized (SingleTon.class){
if(singleTon == null){
singleTon = new SingleTon();
}
}
}
return singleTon;
}*/
public static synchronized SingleTon getInstance(){
if(singleTon == null){
singleTon = new SingleTon();
}
return singleTon;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(()->{
SingleTon.getInstance();
}).start();
}
}
}
我们可以看到,加在方法上面一次就行了,因为虚拟机在执行方法的时候会加锁。
但是使用注释的代码那边,这种叫多线程双重校验,这里由于方法上没有关键字,导致多个线程同时锁住SingleTon.class,导致单例失败。所以我们在使用这种代码块锁的时候要额外注意。
注意:volatile 这个关键字的使用是个加分项。
标签:没有 void print pac 失败 asi read highlight vol
原文地址:https://www.cnblogs.com/johnzhao/p/14654208.html