关注
首先在来接syn锁之前,需要了解我们java中对象头的结构,对象头中包含objectheader,class work以及我们的markword,markword主要从初hashcode 分代年龄等信息,首先对于原始的syn锁,我们也叫他重量级锁,在对对象加锁的过程中,会调用native方法跟操作系统申请一个监视器对象,然后将二者关联起来,在关联的过程中,会讲对象头中的markword交给monitor管理,然后markword存储对应monitor的地址,方便我们后续加锁的时候寻址,syn锁是基于monitor实现的,他里面包含owner来存储thread对象,为null则表示当前没有线程获取锁,不为null则表示已经有人获取锁了,会进入到entryset中排队等待,当然如果获取锁的线程由于一些i蛀牙UN没有准备好,进入wait,会释放锁然后进入到waitset中等待,当其他持有锁的线程进行notify后会将waitset中线程放入到entryset中等待,这个set是无序集合,所以不确定哪个线程被调度后持所锁,所以syn是非公平锁,由于加锁每次都需要跟操作系统申请monitor,这个操作sh比较重的,所以jvm底层做了很多优化,比如:重量级锁的自旋,没获取到锁在重试几次,减少线程从运行变更为阻塞状态的上下文切换,还有就是轻量级锁,使用场景是不存咋锁竞争的情况,他会在当前thread staack中创建一个lock record记录,然后将lock record 和 对象头中的markword进行 cas交换,如果当前线程发生了锁重入,发现markword里面存的lockrecrd是当前线程会将所重入的lock 记录 方null,用来记录所重入的次数,释放锁则移除一个lock rerecord,后续如果发生锁竞争,还是会走cas操作尝试交换信息,结果发现已经被交换完了,说明发生了锁竞争就会走锁锁膨胀逻辑,变成重量级锁,然后本身持有轻量级锁的线程会走重量级锁的释放锁的流程.......当然如果不存在锁竞争的情况下,频繁发生自旋,每次都要cas操作,效率也比较低,底层做了优化,干脆直接把线程id刻到markword里面,这也就是偏向锁.......
查看原帖
9 评论
相关推荐
09-11 16:05
门头沟学院 运营 点赞 评论 收藏
分享

点赞 评论 收藏
分享
牛客热帖
更多
- 1... 大二无实习怎么做到获得一份月薪1.5w+量化的实习和多份大厂核心部门实习的1.6W
- 2... 出身寒微,却攥住鹅厂的入场券1.3W
- 3... 机械八股之材料力学笔面试难点与常考点整理1.2W
- 4... 银行秋招9931
- 5... 那些未曾答上来的硬核面试问题4197
- 6... 拼尽全力仍无法战胜美团。27大三双非鼠鼠被美团激情拷打3h3759
- 7... 我眼里的悲伤3696
- 8... 能做到吗?字节抖音电商秋招记录2970
- 9... 华为主管面准备笔记/适用于一切HR面经验贴2530
- 10... 滴滴后端oc面经总结 Java人拿到Go的云原生意向2327
正在热议
更多
# 为了求职,我做过的疯狂伪装 #
9412次浏览 127人参与
# 从顶到拉给所有面过的公司评分 #
6816次浏览 74人参与
# 职场破冰,你们都聊什么? #
5116次浏览 55人参与
# 晒晒你的中秋福利 #
14415次浏览 86人参与
# 聊聊这家公司值得去吗 #
550297次浏览 3668人参与
# 广联达求职进展汇总 #
10391次浏览 50人参与
# 产品每日一题 #
60435次浏览 604人参与
# 实习要如何选择和准备? #
114207次浏览 1436人参与
# 机械人,你最希望上岸的公司是? #
181625次浏览 1894人参与
# 你面试被问到过哪些不会的问题? #
16771次浏览 662人参与
# 机械笔面试考察这些知识点 #
10101次浏览 89人参与
# 如何快速融入团队? #
31881次浏览 278人参与
# bilibili求职进展汇总 #
82162次浏览 759人参与
# 浪潮求职进展汇总 #
16252次浏览 131人参与
# 你觉得早上几点上班合适? #
82055次浏览 329人参与
# 上班后和你想的一样吗? #
78859次浏览 629人参与
# 工作压力大怎么缓解 #
104430次浏览 1046人参与
# 远景求职进展汇总 #
61076次浏览 317人参与
# 电网笔面经互助 #
46146次浏览 428人参与
# 秋招报数:你投了多少家公司? #
24111次浏览 243人参与