什么是线程安全
- 无状态对象一定是线程安全的
原子性
- 竞态条件(Race Condition):不恰当的执行时序导致不正确结果
- 常见竞态条件类型:先检查后执行(Check-Then-Act)
- 延迟初始化中的竞态条件
- 通过添加线程安全的状态变量(原子变量)可以达到线程安全的目的【但是对于多变量有问题】
加锁机制
要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量
1、内置锁
- 同步代码块(Synchronized Block):作为锁的对象引用 + 锁保护的代码块
- 同步方法:锁是方法调用所在对象
- 静态同步方法:以class对象作为锁
2、重入
- 一个线程获取由他自己持有的锁,请求会成功,说明可以重入
- 重入意味着获取锁的粒度是线程,不是调用
用锁来保护状态
- 对于多线程访问的可变状态变量,在访问他时需要持有同一个锁,这时我们称状态变量是由这个锁保护的
- 所有方法都加锁也解决不了竞态条件的问题,还会引入性能问题

活跃性与性能
- 同步代码块的粒度要控制好,不能太大也不能太小