关注
首先在来接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 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
01-08 09:52
门头沟学院 Java
christina2...:楼主你应该问毕业前什么时候能签三方,签三方就代表着给你预留了这个岗位,毕业后直接正式入职。转正答辩拿到正式offer一般都是会签三方的,图片这个HR好像没有三方的概念。 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 牛客新年AI问运 #
12742次浏览 163人参与
# 实习教会我的事 #
59700次浏览 455人参与
# 牛客AI体验站 #
17633次浏览 298人参与
# 最难的技术面是哪家公司? #
66359次浏览 984人参与
# 当你面对裁员会如何? #
367152次浏览 2924人参与
# 职场上哪些行为很加分? #
328118次浏览 3634人参与
# 一张图晒一下你的AI员工 #
14372次浏览 178人参与
# 面试之前应该如何准备? #
219718次浏览 2331人参与
# 找不到实习会影响秋招吗 #
1447571次浏览 13730人参与
# 哪些公司对双非友好 #
208123次浏览 1171人参与
# 九月了,是考研还是就业? #
88775次浏览 549人参与
# 找实习是选平台还是选业务? #
45344次浏览 317人参与
# 实习怎么做才有更好的产出 #
33178次浏览 420人参与
# 第一次面试 #
1073625次浏览 13740人参与
# 这份实习,有没有动摇过你的职业方向? #
1663次浏览 21人参与
# 为了实习逃课值吗? #
66165次浏览 528人参与
# 工作中,努力重要还是选择重要? #
262013次浏览 2475人参与
# 毕业季,给职场新人一些建议 #
189462次浏览 2484人参与
# 拿到offer之后,可以做些什么 #
90864次浏览 461人参与
# 本周投递记录 #
848854次浏览 12229人参与