如何解决如果变量被更新, 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 举报,一经查实,本站将立刻删除。