java - 如果变量被更新, volatile 是否强制增量刷新内存
问题描述
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 保证跨线程的值的可见性(它也有助于发生之前)
x += 1
这不是一个单一的操作代码代码中没有原子性保证。
AtomicInteger.compareAndSet()
并且AtomicInteger.incrementAndGet()
可以用来保证操作的原子性。
假设这 2 个操作由 2 个不同的线程独立管理,则AtomicInteger
无法控制操作的顺序。然后它需要某种形式的wait notify
沟通。
推荐阅读
- android - Android Fileprovider 无法获取 uri
- python - Matplotlib - 饼图 - ValueError:“标签”的长度必须为“x”
- c++ - 如何在汽车类中定义改变汽车位置的方法
- mysql - MySQL 无法连接 Ubuntu
- javascript - 前面参数的默认值
- wordpress - 忽略一张特定图像的 max_srcset_image_width 过滤器
- python - 如何忽略列表文件中暂时和随机不存在的名称?
- javascript - 如何验证 Angular js 中的字段(非空白)
- c# - 解码包含 JSON 字符串的 JSON 字符串
- r - 如果行中出现一个值,则所有后续行都应采用该值(使用 dplyr)