- 目标:共享的可变的状态访问
- 解决的手段:
- synchronized
- volatile
- 显示锁
- 原子变量
- 先保证正确,再保证性能
- 什么是线程安全的:当多个线程访问某个类时,这个类始终都能便显出正确的行为
- 无状态对象一定是线程安全的(all局部变量)
- 竞争条件:基于一种可能失效的观察结果来做出判断或者某个计算,"先检查后执行"
- 计数器:院子类
- 缓存一个key的value,得使用锁,保证原子性
- 用锁来保护状态: 如果用同步来协调对某个变量的访问那么访问这个变量的所有位置上都需要使用同步
- 虽然synchronized方法可以保证单个操作的原子性,但如果把多个操作合并为一个复合操作,还是需要额外的加锁机制
- 使用两种不同的同步机制不仅会带来混乱,也不会在性能或者安全性上带来任何好处,因此这里不使用原子变量
- 在执行较长的方法上不要加锁,例如io操作,或者比较重的计算操作