java 一个volatile的疑惑

单刀 发布于 2016/06/21 10:56
阅读 440
收藏 0
请问这个reader方法是线程安全的么
加载中
0
12叔
12叔
不是
单刀
单刀
对的 。这个问题我昨天想通了。哈哈,谢谢。
1
_kolnick
_kolnick

 

volatile变量自身具有下列特性:

  • 可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。
  • 原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。

因此此写法是线程安全的

可以看我blog:http://my.oschina.net/kolnick/blog/625632  这个是volatile的应用场景

_kolnick
_kolnick
回复 @单刀 : 怎么不理解了 ,你倒是说说 别人问的是这个方法 是不是线程安全,他又没说当前这个类是否 是做为 全局共享变量。
单刀
单刀
不安全 ,你把书上的东西都搬到网上来,可是你没理解它
0
zheng_pat
zheng_pat
voliate解决不了线程安全问题,在这个只是确保可见性的,防止编译排序
0
Ambitor
Ambitor
感觉你问的很不专业啊,线程安不安全还用看 ?你这个方法 压根就没有做修改全局数据的操作,何来线程安不安全?另外 关于volatile 的问题 可以看看我这篇博客。哈哈http://my.oschina.net/ambitor/blog/661907
Ambitor
Ambitor
回复 @单刀 : ....大兄弟,无论你的类的实例被什么结构引用,无论你改变这个标志有多少,只要完全不涉及全局变量(也就是主存的数据) 是不会有线程安全问题的,就和你这个例子一样。 所以我说你这个问法 要么是例子没写明白 要么是问的不对。。
单刀
单刀
回复 @Ambitor : 这个局部变量 i确实是个失败的例子,给它换成成员变量吧
单刀
单刀
回复 @Ambitor : 首先,除了全局变量,成员变量也有线程安全问题。再者,没人告诉你这个类的实例被一个什么样的结构引用,改变那个状态标识的地方可以有很多
Ambitor
Ambitor
回复 @单刀 : 对于你这个例子 reader方法 里面只是做了一个简单的赋值 int i=a 并没使用到i变量做任何事情 完全是一个幂等的方法。
Ambitor
Ambitor
回复 @单刀 : 还有再请问楼主 除了操作主内存数据的时候会有线程安全的考虑 难道在操作线程私有的工作内存数据的时候也需要考虑线程安全问题,比如TLAB的数据?
下一页
0
红薯的小黄瓜
红薯的小黄瓜
楼主只是问问reader方法线程安全不安全,楼上几个就说了一大堆废话
0
tuzhao
tuzhao
不是安全的!千万别这么用!它只是告诉不同的线程间值的可见性与及时性。
0
slym_yq
slym_yq
参考   https://yq.aliyun.com/ask?spm=5176.100242.0.0.4KKWPY
0
byhard
byhard
线程安全讲得是主内存的可见性。而方法体内的局部变量不是线程共享的。
返回顶部
顶部