Java中的偏向锁,轻量级锁,重量级锁关系总结

Java中锁是实现线程同步的一个比不可少的组件。

Java锁按照等级分可以为 偏向锁->轻量级锁->重量级锁。

他们对应的等级逐级提升。

1.前序知识

首先我们要知道对象头(Mark Word),简单的来说对象头是保存对象信息的一端记录,其中有对象的哈希码,分代年龄等等,其中有2bit用来储存锁信息。分别对应:

2.偏向锁

偏向锁是锁定效率最高的锁,是JDK1.6才出现的,研究人员发现:很多情况都是一个线程在用一个带锁的同步块,这样如果长时间的把这块代码的锁给这个线程也未必不可。偏向锁的“偏”本身就是偏心的意思,在开启偏向锁时,当第一个线程访问访问这块代码时就会获得获得这块代码的偏向锁。如果没有其他进入这块代码,这个线程就会一直拥有这个偏向锁,在之后每次进入这段代码都畅通无阻,直接运行。

具体做法虚拟机把第一个获得这块代码的线程的线程ID记录的带锁对象的MarkWord中,如果这个操作成功了,该线程之后访问这块代码时都可以直接执行。

例如我们有一段代码如下:

public synchronized void myMethod() {
        ...
}

这个同步方法在执行会对方法属于的实例(假设这个实例名为:对象1)进行上锁,正在执行该方法的对象会获得该锁。在偏向锁的情况下,如果线程1是第一个执行这段代码的,那么线程1的线程id将被记录到对象1的MarkWord中,并且对象1的MarkWord中的锁标志位变为01(偏向模式)。这时这个线程就会长期拥有这个对象的锁(获得了虚拟机的偏心),之后每次执行这个对象的myMethod()方法时无需在进行获得锁操作,直接运行。直到有其他线程来竞争锁。

3.轻量级锁

事实上,偏向锁是最轻量的锁,它甚至都没有解锁这个功能。如果一个非偏向的线程来竞争锁,它直接进行撤销锁操作,然后转到轻量级锁。

当一个线程获得轻量级锁时,虚拟机首先会把带锁对象(还用对象1)的markword做一份拷贝传到线程的虚拟机栈中,然后修改对象1的markword的内容为指向该拷贝的指针,修改标志位为00。在代码执行完毕后再把这个拷贝中的内容还原到对象1的markword中,修改标志位为01。

在一个线程获得轻量级锁的这段时间里,如果有其他线程来竞争锁,依然会进行上述的动作,但是因为markword中存储的信息已经是指向线程的指针了,因此会发生操作错误。这时虚拟机会检测这个这个指针,如果指针指向的线程与目前想要获得锁的线程相同,就直接运行代码。

如果不同,就发生了两个线程竞争锁的现象,这时会让新来的线程进行一个自旋等待,如果等待结束后能获得锁,就继续获得该对象的轻量级锁。如果还是无法获取锁,这时轻量级锁会膨胀为重量级锁,对象1的markword的标志位修改为10,并让等待锁的线程进入阻塞状态。

4.重量级锁

我们通常所说的锁操作都是通过使用互斥量进行的,在操作线程时(休眠,唤醒等)用需要线程进行内核态和用户态的切换。这一块不明白可以查阅资料,总体来说就是一个非常耗时的操作。重量级锁就是这样的,操作它是一个非常麻烦的操作(相比与其他锁)。当对象进入重量级锁时,说明程序内发生了多个线程竞争锁的情况,这时对象1的markword的标志位修改为10,通过互斥量进行锁的竞争和操作。

5.小结

为什么会有这么多的锁?

这是jvm对代码的一种优化,操作重量级锁是一个很费时的操作,如果不论情形,每次都操作重量级锁,那么代码的执行效率会大打折扣。于是才出现了偏向锁,轻量级锁。

这两个锁都没有通过操作互斥量进行锁操作。偏向锁是在理想的情况下(无人竞争锁时)提供了类似于锁消除的处理,让一个线程高效的执行这段代码块。

轻量级锁则是通过操作锁对象的MarkWord进行获得锁操作,其他的线程获取锁时会进行一个等待,之后通过结果判断继续用轻量级锁还是用重量级锁。这里看出,如果竞争不激烈,甚至是按顺序的获取锁时,轻量级锁就可以完成任务。如果有大量的竞争的操作再使用重量级锁。

在真正的代码运行环境中,大量的锁竞争发生的很少。因此,为了减少锁操作的成本,才有了偏向转轻量,轻量转重量的流程,让不同程度的锁竞争使用不同的锁,减少了大量的不必要的浪费。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值