synchronized通过Monitor实现线程安全,同步代码块用monitorenter/monitorexit指令,同步方法靠ACC_SYNCHRONIZED标志。每个对象的对象头中Mark Word记录锁状态和线程信息,支持偏向锁(单线程无CAS)、轻量级锁(CAS竞争)到重量级锁(操作系统互斥量)的升级,不可降级。wait/notify基于Monitor的等待队列实现线程协作,整体通过JVM优化在低竞争下高效、高竞争下正确。

在 Java 中,synchronized 是用来保证线程安全的关键字,它的底层实现依赖于 JVM 对对象监视器(Monitor)的支持。synchronized 的实现主要基于对象头中的 Mark Word 和操作系统的互斥锁(Mutex Lock)机制。
synchronized 可以修饰代码块或方法,其底层实现略有不同:
每个 Java 对象都可以作为锁,是因为每个对象在堆中都有一个对象头(Object Header),其中包含一个叫 Mark Word 的结构。Mark Word 在 64 位 JVM 中通常记录:
当某个线程进入 synchronized 块时,JVM 会检查对象的 Mark Word 状态,根据当前情况决定是否升级锁。
立即学习“Java免费学习笔记(深入)”;
为了减少获取锁的开销,synchronized 实现了锁的优化策略,包括以下几种状态:
锁只能升级不能降级,这是为了保证效率和安全性。
Monitor 不仅用于互斥,还支持线程间的协作。当线程调用 wait() 方法时,它会释放 Monitor 并进入 Monitor 的等待队列;其他线程调用 notify() 或 notifyAll() 时,会唤醒等待队列中的线程重新竞争锁。
基本上就这些。synchronized 的高效之处在于 JVM 层面结合了对象头、CAS 操作和操作系统锁的综合优化,从偏向锁到重量级锁的动态升级机制,使得它在低竞争下性能很好,在高竞争下也能保证正确性。
以上就是java 中说一下 synchronized 底层实现原理?的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号