Java 如果变量被更新,volatile是否强制增量刷新内存

Java 如果变量被更新,volatile是否强制增量刷新内存,java,volatile,Java,Volatile,在示例代码中,2可能交错到读取操作2a和更新操作2b。在1-2a-3-2b的情况下,2a首先从共享内存中获取x的值,即10。然后3将20分配给x,并立即写入共享内存。对于下一步2b,存储变量x的线程内存是否会由于volatile关键字而被强制刷新,这意味着内存更新为20,结果为21?或者它仍然使用以前的值10,结果是11 非常感谢 可见度 volatile保证了值在线程之间的可见性(它也有助于避免以前发生的情况) x+=1 这不是一个单一的操作,代码中没有原子性保证 AtomicInteger.

在示例代码中,
2
可能交错到读取操作
2a
和更新操作
2b
。在
1-2a-3-2b
的情况下,
2a
首先从共享内存中获取x的值,即10。然后
3
将20分配给x,并立即写入共享内存。对于下一步
2b
,存储变量x的线程内存是否会由于
volatile关键字
而被强制刷新,这意味着内存更新为20,结果为21?或者它仍然使用以前的值10,结果是11

非常感谢

可见度 volatile保证了值在线程之间的可见性(它也有助于避免以前发生的情况)

x+=1 这不是一个单一的操作,代码中没有原子性保证

AtomicInteger.compareAndSet()
AtomicInteger.incrementAndGet()
可用于确保操作的原子性


假设这两个操作由两个不同的线程独立管理,则
AtomicInteger
无法控制操作顺序。然后需要某种形式的
wait notify
通信。

如果这两个代码块在不同的线程中,我不知道如何对何时会发生什么做出任何假设,我认为volatile关键字并没有真正的帮助。它可能会改变行为,但我看不出它将如何使它变得更可预测。这就是为什么你需要这些代码的关键部分…这样你就可以预测什么时候会发生。-这个问题的重点是什么?我认为它与任何其他先读后写的调用是一样的,但是,它对您没有什么区别,因为
1-3-2a-2b
应该给出与
1-2a-3-2b
相同的结果,对于2a和2b之间发生更新的场景,窗口要小得多。@Sorifind非常感谢您的回复。我知道不同的案例可以得出相同的结果。这是一个学校作业,我需要分析不同的交叉案例及其结果。回到我的问题,如果它确实刷新了内存,这是否意味着
2a
读取操作在内存更新后再次运行,并且交错情况变成
1-2a-3-2a-2b
?它们在您的运行、CPU、操作系统等上“返回相同的结果”。
x+=1
不是原子的,就是这样。好的,你理解对了。为什么您认为volatile会以某种方式将线程的工作(本地)内存与共享内存同步?它只是确保每个线程都可以看到对共享内存的更新。下面是正确使用volatile的一个示例。那页上还有更多的例子。
volatile int x;

# thread 1
x = 10;  # 1
x += 1;  # 2a, 2b

# thread 2
x = 20   # 3