Tag: volatile

顺序一致性易变解释

我正在观看来自java jpoint会议的video。 我对来自Alexey Shipilev报告的幻灯片有疑问: 幻灯片上的非英语版请原谅。 实际上作者说变量集是不可能的 r1 = 1 (Y) r2 = 0 (x) r3 = 1 (x) r4 = 0 (Y) 根据video,他暗示这显然是。 根据JMM,有人可以澄清为什么这个价值设定不可能? PS 如果我理解Alexey符号正确,则尊重以下代码: public class SequentialConsistency { static volatile int x; static volatile int y; public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { x = […]

在java中使用volatile关键字的完整示例?

我需要一个在java中使用volatile关键字的简单示例,由于不使用volatile而表现不一致。 挥发性使用的理论部分对我来说已经很清楚了。

顺序一致性和primefaces性之间有什么区别?

我读到java volatile是顺序一致但不是primefaces的。 对于atomicity java提供了不同的库。 有人可以用简单的英语解释两者之间的差异吗? (我相信问题范围包括C / C ++,因此添加这些语言标签以吸引更多的观众。)

使用volatile而不同步

知道 对于声明为volatile的所有变量,读取和写入都是primefaces的 问题1:这可以理解为 private volatile int x = 0; x++; 操作是primefaces的? 然后 标记变量volatile不会消除同步primefaces操作的所有需要​​,因为仍然可能存在内存一致性错误。 问题2:我想知道在什么情况下(如果有的话)可以看到标记为volatile的变量并且看不到任何标记为synchronized的块的方法(试图访问/修改变量)? 换句话说,是否应将所有需要保护以防止并发修改的变量标记为volatile ?

内存屏障和锁定前缀指令之间的区别

在本文内存障碍和JVM并发 !中,我被告知volatile是由不同的内存屏障指令实现的,而synchronized和atomic是通过锁定前缀指令实现的。 但我在其他一些文章中得到了以下代码: java代码: volatile Singleton instance = new Singleton(); 汇编指令(x86): 0x01a3de1d: movb $0x0,0x1104800(%esi); 0x01a3de24: lock addl $0x0,(%esp); 那么哪一个是对的?内存障碍和锁定前缀指令有什么区别而不考虑我的英语不好?

内存不一致与线程交错有何不同?

我正在编写一个multithreading程序,正在研究是否应该使用volatile作为我的布尔标志。 关于并发性的文档oracle跟踪并没有解释除了以下内容之外的任何memory consistency errors : 当不同的线程具有应该是相同数据的不一致视图时,会发生内存一致性错误。 假设这些不一致的视图仅在“写入”操作之后发生是有意义的。 但是多久之后呢? 例1 Thread A: Retrieve flag. Thread B: Retrieve flag. Thread A: Negate retrieved value; result is true. Thread A: Store result in flag; flag is now true. Thread B: System.out.print(flag) –> false 由于Thread A和Thread B同时运行,因此打印也可以为true,具体取决于何时检索flag 。 对于不一致而言,这是完全合理的。 但是描述memory consistency errors的方式(写入变量不一定反映在其他线程中)听起来这也是如此: 例2 Thread A: Retrieve flag. Thread A: […]

如果多个线程可以访问某个字段,那么它应该标记为volatile吗?

阅读一些线程( 常见的并发问题 , volatile关键字 , 内存模型 )我对Java中的并发问题感到困惑。 我有很多字段可以被多个线程访问。 我应该通过它们并将它们全部标记为易变? 在构建一个类时,我不知道多个线程是否会访问它,所以让任何字段都不易变化是不安全的,所以根据我的理解,你很少会使用它。 它是否正确? 对我来说,这是特定于版本1.5 JVM及更高版本,但不仅限于回答我的特定设置。

Java并发:“级联”变量中的易失性与最终性?

是 final Map<Integer,Map> status = new ConcurrentHashMap<Integer, Map>(); Map<Integer,Map> statusInner = new ConcurrentHashMap<Integer, Map>(); status.put(key,statusInner); 同样的 volatile Map<Integer,Map> status = new ConcurrentHashMap<Integer, Map>(); Map<Integer,Map> statusInner = new ConcurrentHashMap<Integer, Map>(); status.put(key,statusInner); 如果内部Map由不同的线程访问? 或者甚至是这样的要求: volatile Map<Integer,Map> status = new ConcurrentHashMap<Integer, Map>(); volatile Map<Integer,Map> statusInner = new ConcurrentHashMap<Integer, Map>(); status.put(key,statusInner); 如果它不是“级联”映射,则final和volatile最终会产生相同的效果,即所有线程总是看到Map的正确内容……但是如果Map iteself包含一个map,会发生什么?如示例中所示…如何使内部地图正确“内存瘫痪”? 坦克! 汤姆

Java:引用同步对象需要volatile / final吗?

这似乎是一个非常基本的问题,但我找不到明确的确认。 假设我有一个正确同步的类: public class SyncClass { private int field; public synchronized void doSomething() { field = field * 2; } public synchronized void doSomethingElse() { field = field * 3; } } 如果我需要引用该类的实例,在线程之间共享, 我仍然需要声明该实例是volatile还是final ,我是对的吗? 如: public class MainClass { // previously OuterClass public static void main(String [ ] args) { final SyncClass mySharedObject = […]

使用volatile关键字时内存一致性错误的示例?

来自docs: 使用volatile变量可降低内存一致性错误的风险 但是这意味着有时候volatile变量不能正常工作? 奇怪的是如何使用它 – 我认为这是非常糟糕的代码,有时有时不工作。 我试过谷歌,但没有找到与volatile有关的示例内存一致性错误。 你能提出一个吗?