关注
首先在来接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 评论
相关推荐
查看12道真题和解析 点赞 评论 收藏
分享
11-22 23:17
门头沟学院 C++ 点赞 评论 收藏
分享
投票
点赞 评论 收藏
分享
南宫生:大二上和逆流哥相识,现在逆流哥已经飞升了,而我还是条蛆

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 实习越久越好,还是多多益善? #
4059次浏览 41人参与
# 0经验如何找实习? #
4559次浏览 119人参与
# 百融云创求职进展汇总 #
6843次浏览 95人参与
# 刚工作,应该先搞钱or搞成长? #
2097次浏览 33人参与
# 你找工作经历过哪些骗局? #
2211次浏览 49人参与
# 你开始找寒假实习了吗? #
3636次浏览 66人参与
# 实习必须要去大厂吗? #
163301次浏览 1617人参与
# 25年找工作是什么难度? #
3521次浏览 42人参与
# 离职你会和父母说吗? #
3475次浏览 49人参与
# 一上班就想____,这正常吗? #
898次浏览 25人参与
# 产品每日一题 #
72704次浏览 649人参与
# 你会为了工作牺牲生活吗? #
64676次浏览 438人参与
# 如果公司降薪,你会跳槽吗? #
108742次浏览 676人参与
# 非技术求职现状 #
555757次浏览 3519人参与
# 教师节,你送祝福了吗 #
19951次浏览 95人参与
# 实习,不懂就问 #
135969次浏览 1261人参与
# 今年形式下双非本找得到工作吗 #
260714次浏览 1517人参与
# 每个月的工资都是怎么分配的? #
78319次浏览 659人参与
# 总结:哪家公司面试体验感最差 #
80474次浏览 373人参与
# 2025年终总结 #
26632次浏览 366人参与
# Offer比较,你最看重什么? #
242647次浏览 1502人参与
