首页 > 解决方案 > 如果变量被更新, volatile 是否强制增量刷新内存

问题描述

volatile int x;

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

# thread 2
x = 20   # 3

在示例代码中,2可能会交织到读取操作2a和更新操作2b。在这种情况下1 - 2a - 3 - 2b2a首先从共享内存中获取 x 的值,即 10。然后3将 20 分配给 x 并立即写入共享内存。下一步2b,存储变量x的线程内存是否会因为 被强制刷新volatile keyword,也就是说内存更新为20,结果为21?或者它仍然使用之前的值 10,结果是 11?

提前谢谢了!

标签: javavolatile

解决方案


能见度

volatile 保证跨线程的值的可见性(它也有助于发生之前)

x += 1

这不是一个单一的操作代码代码中没有原子性保证。

AtomicInteger.compareAndSet()并且AtomicInteger.incrementAndGet()可以用来保证操作的原子性。

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


推荐阅读