外观
volatile、synchronized 和 Atomic,分别解决什么问题?
标准回答
volatile 保证可见性并提供相应的内存排序约束,但不让 i++ 这类读改写变成原子操作;synchronized 通过同一把锁提供互斥,并保证解锁后写入对随后加锁线程可见;Atomic 类为单个变量提供 CAS 等原子操作。多个变量共同满足一个条件时,仍需统一的同步设计。
通俗例子
两个回调同时做 count++,都先读到 5,再各自写回 6,结果少算一次。把 count 声明成 volatile 仍会这样;AtomicInteger.incrementAndGet() 能避免这次丢失,多字段一起变更则通常需要共同的锁。
深入解释
**可见性为什么不等于原子性:**volatile 能让相关线程按内存模型看到更新,但 count++ 包含读取、加一、写回。两个线程都先读同一个旧值,仍可能写回同一个新值而少加一次。
**锁和原子类如何选:**只给一个计数器做支持的原子更新,可用 AtomicInteger;若“计数与列表内容”必须一起变更,应保证这些修改整体执行,而不是只给其中一个字段加 volatile。
易混淆点
Thread.sleep 不是线程间的同步手段;“等一会儿应该就好了”不能替代正确的同步。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
job-J06