虚拟机内部对锁的优化——偏向锁、轻量级锁、锁膨胀、自旋锁、锁消除

以下内容只是自己的理解,可能和实际情况有出入

 

一、锁的实现

每一个对象都有一个对象头,对象头有另个部分,第一部分官方称为“Mark word”,用于保存对象的哈希码,GC分代年龄和锁相关的信息。另一部分保存对象在方法区对应的类信息的指针(如果是数组的话还有数组长度)。Mark word 的长度在32位虚拟机中为32位,在64位虚拟机中为64位。

Mark word 中有一部分用于记录锁的信息,在32位虚拟机中,这部分的大小为3位。第一位用于记录是否为偏向锁,后两位表示锁的锁定情况(01未锁定、00轻量级锁定、10重量级锁定、01偏向锁)。

二、偏向锁

对象的锁被线程获取后,进入偏向模式。当此线程再次请求这个对象时,无需进行相关的同步操作,从而节省操作时间。

三、轻量级锁

如果偏向锁失败,虚拟机会让线程用CAS操作申请轻量级锁,如果申请成功了,此线程便获得了该对象的轻量级锁。下一次此线程再次访问这个对象时,依然使用CAS操作申请资源,发现以及获取到了该对象的轻量级锁,就可以直接进入同步块继续执行。

四、锁膨胀(重量级锁)

偏向锁和轻量级锁只是为了在竞争很少的情况下提高性能,当线程竞争激烈时,这两个锁的操作反而会变得无意义。

于是,当另个线程竞争同一个轻量级锁时,轻量级锁就会膨胀为重量级锁。

整体流程就是,一个线程(线程1)访问一个资源,便会获得偏向锁。再次访问时,如果此线程(线程1)有该资源的偏向锁,就无需进行同步操作。若两次访问期间,有别的线程(线程2)尝试访问该资源,偏向锁失效。线程1会尝试获得轻量级锁。此时线程1仍然拥有资源的锁。若此时又有其他线程来竞争资源,轻量级锁膨胀为重量级锁。

五、自旋锁

线程没有获取到锁时,不被挂起,转而执行一个空循环(即自旋)。若干次自旋后,若能够获取到资源的锁,则继续执行。否则将被挂起。(线程被挂起会导致上下文切换,性能损失较大。)

六、锁消除 

有的工具类(例如Vector)内置了锁,然而有一些情况这些资源不可能会被多个线程同时访问,此时同步操作会影响性能,并且没有意义,虚拟机会进行锁消除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值