synchronized底层原理是什么呢?
下文笔者讲述"synchronized底层原理"简介说明,如下所示
synchronized底层原理
`synchronized`底层原理
主要依赖于
Java对象头(Object Header)
和 Monitor(监视器)机制
并结合JVM内部的锁优化策略实现
synchronized底层原理详解
1.Java对象头(Object Header)
每个 Java 对象在内存中都有一个对象头,其中包含:
-Mark Word:存储哈希码、GC 分代年龄、锁状态等信息。
-Klass Pointer:指向对象的类元信息。
当使用`synchronized`时
JVM会修改对象头中Mark Word来
记录锁的状态和持有锁线程信息
2.Monitor监视器
-每个Java对象都可以作为锁(Monitor),
JVM使用C++实现`ObjectMonitor`类来管理锁
-线程尝试获取锁时,
会进入Monitor等待队列
只有成功获取锁的线程才能执行同步代码块
3.锁的类型与升级过程
JVM在运行过程中根据竞争情况对锁进行自动升级,
提升性能:
-无锁状态:对象未被任何线程锁定。
-偏向锁(Biased Locking):
-如果一个线程获得了锁之后,
在没有其他线程竞争的情况下,
后续再次进入同步块时不需要进行CAS操作
-适用于单线程访问场景。
-轻量级锁(Lightweight Locking):
-当多个线程交替执行同步块时,
JVM使用CAS 操作尝试将对象头中Mark Word替换
为指向线程栈中锁记录的指针。
-避免线程阻塞,减少上下文切换开销。
-重量级锁(Heavyweight Locking):
-当多个线程发生竞争时,
锁会膨胀为重量级锁,
此时线程会被阻塞并进入内核态等待唤醒。
-性能开销较大,
但能保证线程安全。
4.字节码层面的实现
-同步方法:JVM使用`ACC_SYNCHRONIZED`标志位控制方法的同步。
-同步代码块:编译后插入`monitorenter`
和`monitorexit`字节码指令,
分别对应加锁和释放锁的操作
5.可重入性
-`synchronized`支持可重入,
同一个线程可以多次获得同一把锁。
-JVM 通过记录锁的持有次数(recursion count)来实现这一点,
每次获取锁计数加一,
释放锁减一,
直到计数为零才真正释放锁。
synchronized底层原理总结
`synchronized`底层原理是
基于对象头中Mark Word和Monitor机制,
并通过锁升级策略
(偏向锁-->轻量级锁-->重量级锁)
进行性能优化
从而实现线程同步和互斥访问。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


