【提问】java关键字volatile、双重检查 单例模式的应用

SealedBook 2010-04-21 01:51:55

class MyClass {
private static volatile MyClass myClass = null;

private MyClass() {
}

public static MyClass getInstance() {
if(myClass == null) {
synchronized (MyClass.class) {
if(myClass == null) {
myClass = new MyClass();
}
}
}
return myClass;
}
}

volatile关键字我不太明白在上面代码中的作用,既然已经进行双重检查了,还有必要把myClass声明volatile吗?
求教,谢谢!
...全文
212 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SealedBook 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zangxt 的回复:]
http://www.ibm.com/developerworks/cn/java/j-dcl.html
[/Quote]
谢谢!
研究 ing...
SealedBook 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zangxt 的回复:]
没有volatile并不能保证双检锁正确工作。
这种模式现在基本不建议使用了,不必关注了
重点可以去看一下java内存模型。
[/Quote]
书上说1.4以前的版本这么做会失效。
以后的版本也不建议使用?
您的意思是,这种单例模式的实现方法不推荐了是吗?

您说的java内存模型,跟这个有什么关系吗?解释一下..没太明白。
zfq642773391 2010-04-21
  • 打赏
  • 举报
回复
volatile确保了并发时的可视性,即使volatile的域使用了本地缓存,volatile域也会被立即写入主存
虽然有双检查了,可能是为了更加安全吧
beiouwolf 2010-04-21
  • 打赏
  • 举报
回复
volatile关键字不是已经废弃了吗
ZangXT 2010-04-21
  • 打赏
  • 举报
回复
没有volatile并不能保证双检锁正确工作。
这种模式现在基本不建议使用了,不必关注了
重点可以去看一下java内存模型。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧