图解synchronized底层原理

synchronized 是 Java 中用于实现线程同步的关键字,它的底层原理涉及到 Java 对象头(Object Header)、Monitor、锁升级和锁降级等概念。

  1. 对象头(Object Header):每个Java对象在内存中都有一个对象头,其中包含了一些元数据信息,其中一个字段用于存储对象的锁信息。

  2. Monitor:Monitor 是一种数据结构,用于管理对象的锁信息。每个Java对象都会关联一个 Monitor 对象,用于管理对该对象的访问控制。Monitor 包含了锁的状态(无锁、偏向锁、轻量级锁、重量级锁)以及持有锁的线程信息等。

  3. 锁升级和锁降级

    • 初始状态:对象的锁状态为无锁状态,多个线程可以同时访问对象。
    • 偏向锁(Bias Locking):当只有一个线程访问对象时,该线程可以通过偏向锁获得对象的独占访问权。此时,对象头中的偏向线程ID字段会记录这个线程的ID,后续访问时直接获得锁,不需要竞争。
    • 轻量级锁(Lightweight Locking):当多个线程尝试获得偏向锁失败时,会升级为轻量级锁。此时,竞争的线程会自旋一段时间,尝试获得锁,而不是阻塞。如果自旋成功,线程就获得了锁,否则升级为重量级锁。
    • 重量级锁(Heavyweight Locking):当轻量级锁自旋失败时,会升级为重量级锁,此时线程会阻塞等待锁的释放,使用操作系统提供的底层机制来实现。

synchronized 关键字的底层原理就是通过这些机制来确保多个线程之间对共享资源的安全访问。不同的锁状态和锁升级、降级机制都旨在提高多线程并发访问的效率,尽量减少线程之间的竞争和阻塞,以提高程序的性能。

需要注意的是,Java 5 之后引入了更高级别的锁机制,如 java.util.concurrent 包中的 ReentrantLockSemaphore,它们提供了更灵活的线程同步方式,可以更精细地控制锁的行为。

1.重量级锁

在这里插入图片描述
2.轻量级锁

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
3.偏向锁
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值