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