- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我以前认为多线程的危害只有两个:
x
,然后在它可以写回另一个线程之前写入x
。x
和y
,但在这两者之间写入另一个线程读取x
的新值和 y
的旧值,即使这些变量应该一起改变。我想如果我能推断出这些事情不会发生,我就不需要同步。但是来自an argument over the D language forums我从编译器、CPU 和内存在幕后的工作方式了解到可能存在其他危险:
我现在在一个 Android 项目上工作,我又一次遇到了类似的问题 - 我可以推断出一些函数在竞争条件和不稳定状态下是安全的,但不能推断出这三种幕后危险。
我遇到过 Java volatile
成员字段,据我所知,它使用内存屏障来防止 CPU 打乱执行顺序(显然编译器不会打乱它如果它阻止 CPU 这样做)那么它应该解决第一个危险。但是另外两个呢?
换句话说 - 如果我可以推断竞争条件和不稳定状态不是问题,并将共享变量标记为 volatile
,那么不使用同步是否安全?
最佳答案
我不知道第一个和第三个问题(如果你确定的话,关于第一个问题的一些链接会很好)但我确信它解决了你的第二个问题,因为 volatile 确保刷新本地缓存。
更新
我想我找到了您问题的完美链接:
http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz2vjymNleY
<强>1。关于重新排序
By the way use of volatile keyword also prevents compiler or JVM from reordering of code or moving away them from synchronization barrier.
<强>2。关于缓存
Volatile keyword in Java is used as an indicator to Java compiler and Thread that do not cache value of this variable and always read it from main memory
<强>3。关于原子读写
In Java reads and writes are atomic for all variables declared using Java volatile keyword (including long and double variables).
关于java - volatile 会保护我免受所有幕后多线程危害吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22346385/
当我开始学习 Java 时,有人告诉我不要在 Java EE 应用程序中执行 System.out.println。但是我真的不知道不这样做的原因是什么。 我很清楚如果我们真的需要打印一个重要的,它应
我是一名优秀的程序员,十分优秀!