java - Java双重检查锁单例必须使用volatile关键字?
问题描述
嗨,我在单例模式中的双重检查锁定有问题。在以下代码中:
private volatile static DoubleCheckSingleton instance;
private DoubleCheckSingleton() {}
public static DoubleCheckSingleton getInstance(){
if(instance==null){ //first
synchronized (DoubleCheckSingleton.class){
if(instance==null){ // second
instance=new DoubleCheckSingleton();
}
}
}
return instance;
}
假设现在有两个线程,分别是 A 和 B。之后它们同时执行。根据happens-before的定义,一个线程释放锁后,另一个线程获取锁,那么后者可以看到之前的变化。
如果是这样,我认为不需要 volatile 关键字,那我们为什么要在这里使用 volatile 关键字呢?哪位朋友能解释一下?谢谢您的回答
解决方案
推荐阅读
- python - cvxpy/ecos pip 安装错误
- sql - 具有 2 个嵌套到同一张表上的查询的 SQL 查询
- javascript - 在 JavaScript/ASP.net MVC 中从单独的 iFrame 中刷新 Div
- django - Django 中的简单测试失败
- python - 强制退出后使python脚本在.txt文件中写入输出
- java - 如何通过 mulesoft 连接两个不同的 RESTful api
- elasticsearch - 弹性搜索最佳实践
- r - 如果值出现在另一个集合中,闪亮的 DT 突出显示单元格
- c - (真的)'<' 比 C 中的 '!=' 快吗?
- svn - 恢复复制然后编辑的文件的 SVN 祖先