
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
锁的应用在java线程安全领域上有非常明显的作用,而今天我们就一起来了解一下,java编程中偏向锁与轻量级锁的概念与应用。
一、偏向锁
偏向锁是JDK6中的重要引进,因为HotSpot作者经过研究实践发现,在大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低,引进了偏向锁。偏向锁的“偏”,就是偏心的“偏”、偏袒的“偏”,它的意思是这个锁会偏向于一个获得它的线程,会在对象头存储锁偏向的线程ID,以后该线程进入和退出同步块时只需要检查是否为偏向锁、锁标志位以及ThreadID即可。
1、偏向锁的使用场景
偏向锁是为了在资源没有被多线程竞争的情况下尽量减少锁带来的性能开销。
在锁对象的对象头中有一个ThreadId字段,当一个线程访问锁时,如果该锁没有被其他线程访问过,即ThreadId字段为空,那么JVM让其持有偏向锁,并将ThreadId字段的值设置为该线程的ID。当下一次获取锁的时候,会判断ThreadId是否相等,如果一致就不会重复获取锁,从而提高了运行效率。
如果存在锁的竞争情况,偏向锁就会被撤销并升级为轻量级锁。
2、偏向锁的状态
匿名偏向(Anonymouslybiased)在此状态下threadpointer为NULL(0),意味着还没有线程偏向于这个锁对象。一个试图获取该锁的线程将会面临这个情况,使用原子CAS指令可将该锁对象绑定于当前线程。这是允许偏向锁的类对象的初始状态。
可重偏向(Rebiasable)在此状态下,偏向锁的epoch字段是无效的(与锁对象对应的class的mark_prototype的epoch值不匹配)。下一个试图获取锁对象的线程将会面临这个情况,使用原子CAS指令可将该锁对象绑定于当前线程**。在批量重偏向的操作中,未被持有的锁对象都被至于这个状态,以便允许被快速重偏向。
已偏向(Biased)这种状态下,threadpointer非空,且epoch为有效值——意味着其他线程正在持有这个锁对象。
二、轻量级锁
1、什么是轻量级锁
轻量级锁是JDK6之中加入的新型锁机制,它名字中的“轻量级”是相对于使用monitor的传统锁而言的,因此传统的锁机制就称为“重量级”锁。先需要强调一点的是,轻量级锁并不是用来代替重量级锁的。引入轻量级锁的目的:在多线程交替执行同步块的情况下,尽量避免重量级锁引起的性能消耗,但是如果多个线程在同一时刻进入临界区,会导致轻量级锁膨胀升级重量级锁,所以轻量级锁的出现并非是要替代重量级锁。
2、轻量级锁的使用场景
对于轻量级锁,其性能提升的依据是“对于绝大部分的锁,在整个生命周期内都是不会存在竞争的”,如果打破这个依据则除了互斥的开销外,还有额外的CAS操作,因此在有多线程竞争的情况下,轻量级锁比重量级锁更慢。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。