public class Single{
private Single(){}
private volatile static Single single;
public Single getSingle(){
if(single==null){
synchronized(Single.class){
if(single ==null){
single == new Single();
}
}
}
}
}
- 为什么要使用两个 if 判断呢?
- 因为如果有许多线程在抢一个锁 , 那么当一个线程抢到之后赋了值 ,其它线程还要继续抢 , 这样就会极大的浪费性能 , 所以只要有一个线程抢到锁后完成了赋值 , 那么在其他线程在第一个 if 的时候就隔绝了抢锁的一个过程
- 但是这样会有极小极小的可能性出现一个 BUG
- 这个 BUG 就是 CPU 的乱序执行 , 乱序执行就是两个(几个都行)指令/语句之间没有任何联系 , 那么就可能第二条指令/语句执行在第一条前面
- 这样的话在 new 对象时的汇编指令就有可能发生乱序 , 可能在创建对象的时候内部变量全是初始值 , 哪怕你赋了值
- 所以就需要在对象前面加上一个关键字 volatile , 这个关键字可以防止乱序执行
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于