面试突击:Synchronized底层是如何实现的?(面试必知:Synchronized底层实现原理详解)
原创
一、Synchronized简介
Synchronized是Java中的一个关键字,用于实现线程同步,即在多线程环境中控制对共享资源的访问。它可以保证在同一时刻,只有一个线程可以执行某个方法或代码块,从而防止多个线程同时访问共享资源而引发的数据不一致问题。
二、Synchronized底层实现
Synchronized的底层实现关键依赖性于Java虚拟机(JVM)的内置锁机制。在JVM中,Synchronized的实现涉及到以下几个关键概念:
- Monitor对象
- 偏向锁
- 轻量级锁
- 自旋锁
- 质量锁
三、Monitor对象
Monitor对象是JVM中用于实现Synchronized的关键数据结构,每个Java对象都可以作为Monitor。Monitor可以领会为一个同步的锁池,包含以下三个基本操作:
- monitorenter:当线程进入一个Synchronized方法或代码块时,会尝试获取Monitor对象对应的锁。
- monitorexit:当线程退出Synchronized方法或代码块时,会释放Monitor对象对应的锁。
- wait:线程在Monitor对象上调用wait()方法,会释放锁并进入等待状态。
四、偏向锁
偏向锁是JVM对Synchronized的一种优化,其核心思想是假设锁关键被一个线程持有。当锁被一个线程访问时,JVM会记录锁的拥有者,后续该线程再次访问锁时,可以直接获得,无需再次进行锁竞争。
偏向锁的开启和关闭可以通过JVM参数进行配置:
-XX:+UseBiasedLocking:开启偏向锁
-XX:-UseBiasedLocking:关闭偏向锁
五、轻量级锁
轻量级锁是JVM对Synchronized的另一种优化,当没有竞争时,通过CAS操作避免使用重量级的操作系统互斥量。轻量级锁的核心思想是,当锁处于无竞争状态时,通过CAS操作和指向当前线程的指针来控制锁的状态。
轻量级锁的开启和关闭可以通过JVM参数进行配置:
-XX:+UseLightLocking:开启轻量级锁
-XX:-UseLightLocking:关闭轻量级锁
六、自旋锁
自旋锁是轻量级锁的一种特殊形式,当线程尝试获取轻量级锁时,如果锁已经被其他线程持有,线程会循环检查锁是否可用,而不是立即阻塞。这样可以降低线程状态切换的开销,减成本时间性能。
七、质量锁
质量锁是JVM对轻量级锁的进一步优化,当轻量级锁竞争激烈时,会升级为质量锁。质量锁通过使用额外的Monitor对象来避免多个线程在同一个锁上的自旋,从而降低CPU的功耗。
八、总结
Synchronized是Java中实现线程同步的重要手段,其底层实现涉及到Monitor对象、偏向锁、轻量级锁、自旋锁和质量锁等多种机制。JVM通过这些机制,在不同场景下对Synchronized进行优化,以减成本时间程序的并发性能。
了解Synchronized的底层实现原理,有助于我们更好地使用它来控制线程同步,避免死锁、饥饿等问题,从而减成本时间程序的整体性能。