微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果变量被更新, volatile 是否会强制增量刷新内存 可见性x += 1

如何解决如果变量被更新, volatile 是否会强制增量刷新内存 可见性x += 1

volatile int x;

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

# thread 2
x = 20   # 3

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

非常感谢!

解决方法

可见性

volatile 保证跨线程值的可见性(它也有助于happens-before)

x += 1

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。