我曾经认为只有两种多线程危险:
x
,然后它可以写回另一个线程写x
。x
和y
,但在这两个写入之间,另一个线程会读取x
的新值{\ n} {1}}旧值,即使这些变量应该一起更改。我认为如果我可以说这些事情不会发生,我就不需要同步了。但是从an argument over the D language forums我了解到,编译器,CPU和内存在幕后工作的方式可能存在其他危险:
我现在正在研究一个Android项目,我再次面临类似的问题 - 我可以推断某些功能在竞争条件和不稳定状态下是安全的,但不是关于这三种幕后危险。
我遇到了Java y
成员字段,从我收集的内容中它使用内存屏障来防止CPU搞乱执行顺序(显然编译器不会搞砸了如果它阻止CPU这样做,那么它应该解决第一个危险。但是其他两个呢?
换句话说 - 如果我可以推断竞争条件和不稳定状态不是问题,并将共享变量标记为volatile
,那么不使用同步是否安全?
答案 0 :(得分:1)
我不知道第一个和第三个问题(关于第一个问题的一些链接如果你确定它会很好)但是我确定它修复了你的第二个问题,因为volatile确保刷新本地缓存。
<强>更新强>
我想我找到了你问题的完美链接:
http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz2vjymNleY
<强> 1。关于重新排序
顺便使用volatile关键字也会阻止编译器或JVM重新排序代码或将它们从同步障碍中移开。
<强> 2。关于缓存
Java中的Volatile用作Java编译器和Thread的指示符,它不缓存此变量的值并始终从主内存中读取
第3。关于原子读写
在Java中,读取和写入对于使用Java volatile关键字声明的所有变量都是原子的(包括长变量和双变量)。