synchronized

jdk的优化

偏向锁、轻量级锁、重量级锁、自旋、适应性自旋

偏向锁

  1. 对象头中,记录持有锁的线程ID
  2. 通过CAS竞争获取锁,如果获取锁失败,说明有竞争,升级轻量级锁
  3. 通过CAS获取到锁后,在全局安全点释放原持有锁的线程。

轻量级锁

  1. 在栈中创建锁记录,然后利用cas将栈中的锁记录写入对象头,如果成功则表示竞争锁成功。如果cas失败,自旋获取锁,重试一定次数后,还失败则升级重量级锁。
  2. 轻量级锁释放时,cas修改对象头,如果修改失败,说明有竞争(另外一个线程已经将锁膨胀为重量级锁),唤醒被挂起的线程。

重量级锁

通过对象的监视器实现monitor实现,每个对象都有。