synchronized底层如何实现呢?
下文笔者讲述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会根据竞争情况自动进行锁优化和升级
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。