- 实现方式
- JVM没要求实现方式
- 早期都是OS调度
- HotSpot
- 在对象头(64位)上用2位实现,组合成锁的类型
- 锁升级 # 不比原子类慢,升完不降
- 偏向锁, 第一个线程第一次访问只记线程id
- 自旋锁,线程争抢时,JDK6旋10次,现在为CPU内核数一半。非公平
- 重量级锁,OS调度,线程WAIT。符合执行时间长,线程多的场景
- 原子性、可见性
- 可重入 # 同一个对象同线程可重入
- 加锁对象
- 方法锁和对象锁锁this
- static方法锁和类锁锁class类
- 继承时锁的子对象(因为是this), 调super synchronized方法也锁子对象
- 使用注意
- 抛异常立即释放锁,但被锁数据已更新
- 不能用的对象
- String常量,可能未知地方锁同一个
- Integer、Long等基本类型, 值变化会生成新对象
- synchronized的属性加final防止赋值