synchronized底层如何实现呢?

欢喜 Java每日一问 发布时间:2025-06-05 09:12:41 阅读数:14168 1
下文笔者讲述synchronized底层实现的原理简介说明,如下所示

synchronized简介

`synchronized`是Java中
   用于实现线程同步关键字
    其底层主要依赖于 
	   Java 对象头(Object Header)
	      和      Monitor(监视器)机制实现

synchronized底层实现原理

1.对象头中Mark Word:
   - 每个 Java 对象在内存中都有一个对象头,
其中包含一个 `Mark Word`。 - `Mark Word` 用于存储对象的哈希码、
GC 分代年龄、锁状态等信息。 - 当使用 `synchronized` 对某个对象加锁时,
会在对象头中记录锁的状态和持有锁的线程信息。 2.Monitor监视器: - 每个 Java 对象都可以作为锁(Monitor),
JVM 通过 C++ 实现的 `ObjectMonitor` 类来管理对对象的锁定。 - 线程尝试获取锁时,会进入 Monitor 的等待队列,
只有成功获取锁的线程才能执行同步代码块。 3.锁的升级过程(偏向锁-->轻量级锁--->重量级锁): -偏向锁:如果一个线程获得了锁之后,
在没有其他线程竞争的情况下,
后续再次进入同步块时不需要进行 CAS 操作。 -轻量级锁:当存在多个线程交替执行同步块时,
JVM 使用 CAS 操作尝试将对象头中的 Mark Word
替换为指向线程栈中锁记录的指针。 -重量级锁:当多个线程发生竞争时,
锁会膨胀为重量级锁,
此时线程会被阻塞并进入内核态等待唤醒,性能开销较大。 4.字节码层面的实现: - 对于同步方法,JVM 使用 `ACC_SYNCHRONIZED`
标志位控制方法的同步。 - 对于同步代码块,编译后会插入 `monitorenter`
和 `monitorexit` 字节码指令,
分别对应加锁和释放锁的操作。 5.可重入性: - `synchronized` 支持可重入,
同一个线程可以多次获得同一把锁,
JVM 通过记录锁的持有次数来实现这一点。
从以上的信息中,
   我们可以得出以下结论
     `synchronized`底层
	   是通过对象头Mark Word和Monitor结合实现
	    且JVM会根据竞争情况自动进行锁优化和升级
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaProblem/202506/8471.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者