外观
volatile、synchronized、原子类有什么区别?
标准回答
volatile 提供相应的可见性和有序性保证,但不把复合操作变成原子操作;synchronized 用锁保护临界区;原子类适合单个变量的原子更新等场景。
关键机制
- count++ 包含读、加、写,volatile count 仍可能丢更新;可以用锁或 AtomicInteger.incrementAndGet。
- 同一把锁建立互斥和可见性关系;必须确认参与保护的数据都遵守相同锁规则。
- 多个字段需要共同满足不变量时,通常需要一致的锁或不可变状态快照,不能只把每个字段都换成原子类。
通俗例子
余额减少和库存减少必须一起成立,两个 AtomicInteger 只能分别原子变化,不能自动保证“要么都完成,要么都不完成”。
易混淆点
volatile 不是“每次强制从物理内存读取”的完整解释。应从 Java 内存模型的 happens-before 关系理解。
参考资料
内容来源
- Android 技术札记 · 原条目
visibility