Java核心技术:synchronized的底层实现与锁升级

需积分: 0 0 下载量 160 浏览量 更新于2024-08-05 收藏 741KB PDF 举报
"Java核心技术36讲第16讲深入解析synchronized的底层实现机制,包括锁的升级和降级策略。" 在Java编程中,synchronized关键字是用于实现线程同步的重要工具,确保在多线程环境下对共享资源的访问是安全的。在Java 6及后续版本中,JVM针对synchronized进行了优化,引入了多种锁实现,包括偏斜锁、轻量级锁和重量级锁,以适应不同竞争状况下的性能需求。 偏斜锁是一种优化策略,假设大部分对象会被一个线程长期持有。在没有竞争时,JVM会在对象头的Mark Word字段中存储线程ID,表示该对象被当前线程所偏斜持有,避免了锁的建立和销毁的开销。如果另一个线程尝试获取已被偏斜的锁,那么偏斜锁就会被撤销,转而升级为轻量级锁。 轻量级锁是介于偏斜锁和重量级锁之间的一种状态,同样使用CAS操作。当线程尝试获取已被其他线程持有的轻量级锁时,如果锁状态为空,会尝试使用CAS操作替换Mark Word,将锁标记为已锁定并关联当前线程。如果CAS失败,说明有其他线程也在尝试获取这把锁,此时轻量级锁膨胀为重量级锁。 重量级锁依赖于操作系统提供的互斥锁,即临界区,涉及到线程上下文的切换,性能相对较低。当锁竞争激烈,轻量级锁升级为重量级锁时,会将Mark Word替换为指向 Monitor 对象的指针,使得其他线程等待在 Monitor 对象的队列中,直到持有锁的线程释放锁。 锁的降级是指在某些特定情况下,比如持有重量级锁的线程执行完同步代码块后,可以将锁状态恢复为轻量级锁或偏斜锁,以便后续的无竞争情况继续享受优化带来的性能提升。但这并不是一个普遍的过程,而是根据JVM的优化策略和具体实现来决定的。 理解synchronized的底层实现对于优化并发程序至关重要,因为不同的锁状态转换会影响到程序的性能。在设计并发程序时,开发者需要根据实际的并发场景选择合适的同步机制,以达到最佳的性能和可伸缩性。通过掌握这些知识点,你可以更好地理解和调试那些涉及synchronized的复杂并发问题。