synchronized优化
- 背景:synchronized最初作为Java中的重量级锁,开销大,不被推荐使用。
- 优化:随着JDK的发展,特别是JDK1.6以后,synchronized经历了优化,现在广泛应用于JVM源码和开源框架。
对象锁的四种状态
- 无锁状态:无锁定,多线程竞争访问资源,只有一个线程能修改成功。
- 偏向锁:偏向第一个获取锁的线程,减少锁获取的性能开销。
- 轻量级锁:当第二个线程访问时,偏向锁升级为轻量级锁,通过自旋尝试获取锁。
- 重量级锁:一个线程获取锁后,其余线程阻塞,依赖操作系统的Mutex Lock实现。
对象锁的存储
- 存储位置:锁状态存储在对象头的Mark Word中。
- Mark Word:用于存储对象的运行时数据,包括锁状态。
Mark Word在不同锁状态下的内容
- 偏向锁:存储偏向线程的ID,偏向标志置为1。
- 轻量级锁:存储指向线程栈中Lock Record的指针。
- 重量级锁:存储指向监视器(monitor)对象的指针。
synchronized锁升级过程
- 无锁状态:
threadid
为空,所有线程可竞争。 - 偏向锁:首次获取资源的线程ID记录在Mark Word中。
- 轻量级锁:其他线程尝试获取资源,
threadid
不一致时升级。 - 自旋获取:轻量级锁下,线程通过自旋尝试获取资源。
- 重量级锁:自旋失败后,线程阻塞,等待资源释放。