java并发三( Monitor 和 synchronized原理**)

java并发三( Monitor 和 synchronized原理**)

-2022.3.28 -BDY

猛猪猪语录:国家尚未富强,怎能儿女情长


前言

承接上文,但是这部分很重要


一、Monitor

1.java对象头

1.对象结构:
请添加图片描述
2.对象头:
对象头包含两部分:运行时元数据(Mark Word)类型指针 (Klass Word)

1.运行时元数据
哈希值(HashCode),可以看作是堆中对象的地址
GC分代年龄(年龄计数器) (用于新生代from/to区晋升老年代的标准, 阈值为15)
锁状态标志 (用于JDK1.6对synchronized的优化 -> 轻量级锁)
线程持有的锁
偏向线程ID (用于JDK1.6对synchronized的优化 -> 偏向锁)
偏向时间戳

2.类型指针
指向类元数据InstanceKlass,确定该对象所属的类型。指向的其实是方法区中存放的类元信息

请添加图片描述
其中 Mark Word 结构为: 无锁(001)、偏向锁(101)、轻量级锁(00)、重量级锁(10)
请添加图片描述

如果对象是数组,还需要记录数组的长度
请添加图片描述

2.monitor原理(Synchronized底层实现-重量级锁)

多线程同时访问临界区: 使用重量级锁
JDK6对Synchronized的优先状态:偏向锁–>轻量级锁–>重量级锁

请添加图片描述

原理:

  • 当Thread1访问到synchronized(obj)中的共享资源的时候
  • 首先会将synchronized中的锁对象中对象头的MarkWord去尝试指向操作系统的Monitor对象.让锁对象中的MarkWord和Monitor对象相关联. 如果关联成功, 将obj对象头中的MarkWord的对象状态从01改为10。
  • 因为Monitor没有和其他的obj的MarkWord相关联, 所以Thread1就成为了该Monitor的Owner(所有者)。
  • 又来了个Thread1执行synchronized(obj)代码, 它首先会看看能不能执行该临界区的代码;它会检查obj是否关联了Montior, 此时已经有关联了, 它就会去看看该Montior有没有所有者(Owner),发现有所有者了(Thread2); Thread1也会和该Monitor关联, 该线程就会进入到它的EntryList(阻塞队列);
  • 当Thread2执行完临界区代码后, Monitor的Owner(所有者)就空出来了.
    此时就会通知Monitor中的EntryList阻塞队列中的线程, 这些线程通过竞争, 成为新的所有者

请添加图片描述

刚开始时Monitor中的Owner为null

  • 当Thread-2执行synchronized(obj){}代码时就会将Monitor的所有者Owner 设置为Thread-2,上锁成功,Monitor中同一时刻只能有一个Owner
  • 当Thread-2占据锁时,如果线程Thread-3,Thread-4也来执行synchronized(obj){}代码,就会进入EntryList中变成BLOCKED状态
  • Thread-2 执行完同步代码块的内容,然后唤醒 EntryList 中等待的线程来竞争锁,竞争时是非公平的 (仍然是抢占式) 图中
  • WaitSet 中的Thread-0,Thread-1 是之前获得过锁,但条件不满足进入 WAITING状态的线程,后面讲wait-notify 时会分析

————》它加锁就是依赖底层操作系统的 mutex相关指令实现, 所以会造成用户态和内核态之间的切换, 非常耗性能 !

在JDK6的时候, 对synchronized进行了优化, 引入了轻量级锁, 偏向锁, 它们是在JVM的层面上进行加锁逻辑, 就没有了切换的消耗~


二、synchronized原理

1.synchronized原理和进阶

1.底层字节码实现

static final 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值