java volatile使用的问题

暴疯禹 2017-08-28 07:31:51
今天看《设计模式》的时候看到一段代码:

class Singleton{
private volatile static Singleton uniqueInstance;
private Singleton(){}
public static Singleton getInstance(){
if (uniqueInstance == null){
synchronized (Singleton.class){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}

这里边的volatile,有什么必要性吗?我没看懂。
...全文
233 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
a1282379904 2017-09-04
  • 打赏
  • 举报
回复
楼上都在说可见性,单例这里并不是因为可见性问题,synchronized已经可以保证可见性了,这里是因为指令重排序问题 http://blog.csdn.net/a1282379904/article/details/52335016
qq_22231211 2017-08-30
  • 打赏
  • 举报
回复
主要是因为java虚拟机自身优化的关系。程序运行的时候会把uniqueInstance从内存读到寄存器里面,如果修改变量值,可能会只修改寄存器中的变量,内存中的没有修改,多线程情况下会出现内存中的数据和寄存器中保存的值不一致。volatile 就是要求线程直接从内存中读取,不使用寄存器中保留的备份。 大致是这样,凭印象答的。。。。。。
艾伦蓝 2017-08-30
  • 打赏
  • 举报
回复
可见性!第一时间把修改后的值反馈给所有线程!作废所有系统缓存的值!
李德胜1995 2017-08-29
  • 打赏
  • 举报
回复
引用 1 楼 q54244125 的回复:
一个线程修改了变量,其他线程可以立即知道. 一个程序运行的时候,内存会分为两部分,一个是工作内存,一个是主内存。 使用了volatile 关键字可以理解为,只要变量一更改,就通知到其他地方。
你倒是跑啊 2017-08-29
  • 打赏
  • 举报
回复
可以简单理解为,任何对volatile的变量的读写都是经过加锁。
SexyCode 2017-08-29
  • 打赏
  • 举报
回复
是时候祭出我收藏许久的一篇文章了 http://www.barryzhang.com/archives/521,进去后ctrl+F,搜索volatile,你就知道为什么要volatile了。 想彻底理解单例模式的,可以好好看这篇文章。
天涯若风 2017-08-28
  • 打赏
  • 举报
回复
一个线程修改了变量,其他线程可以立即知道. 一个程序运行的时候,内存会分为两部分,一个是工作内存,一个是主内存。 使用了volatile 关键字可以理解为,只要变量一更改,就通知到其他地方。

62,628

社区成员

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

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