java synchronized 锁升级

在JDK1.6之后,synchronized引入了无锁、偏向锁、轻量锁、重量锁的不可逆状态升级过程,以提高锁的获取和释放效率。

四种状态锁对象的对象头以及升级过程

在这里插入图片描述

  1. 最开始锁对象处于无锁状态,当初次执行到synchronized代码块的时候,锁对象变为偏向锁。此时通过cas修改偏向锁标志为1以及mark word改为偏向线程id
  2. 之后当锁对象被其他线程所访问,升级到轻量级锁,其他线程通过自旋的方式获取锁。此时锁标志位改为00,锁对象头除锁标志外的62bit由竞争成功线程栈记录地址指针所替代。
  3. 最后当某个线程自旋次数超过限度(默认为10),那么就由该线程将锁升级为重量级锁,未占有锁对象的线程进入等待队列。此时锁标志位改为10,mark word改为占有该锁的线程对该锁对象对应的重量级锁Monitor的指针

无锁

无锁是指不对资源进行锁定,所有线程都能访问到资源,但只有一个线程能够修改成功。

偏向锁

为什么引入偏向锁

HotSpot作者研究发现,多数情况下其实并不存在锁竞争,常常是一个线程多此获得同一个锁,所以为了降低锁获取代价,于是引入。

也可以通过虚拟机参数-XX:-UseBiasedLocking = false取消偏向锁

获取

线程B比较自己的threadId以及锁对象头threadId是否一致,若一致,则直接获取锁对象,无需使用cas加解锁。若不一致,则查看锁对象头中占有线程A是否存活,若不存活,则未占有线程竞争。若存活,进一步查看占有线程A是否需要继续持有,若需要继续持有,则暂停该线程,升级为轻量级锁,若不继续持有,为占有线程竞争。

轻量级锁

为什么引入

轻量锁考虑的是竞争锁线程不多而且持有锁时间也不长的情况。

重量级锁

重量级锁锁对象头引入了Monitor对象或者说同步工具。

Monitor是线程私有的数据结构,每一个线程都有一个monitor record列表,线程中每一个锁住的对象都有对应的monitor,并且在monitor中有一个owner字段标识着拥有该锁线程。

monitor线程同步是依赖于底层操作系统的mutex lock来实现同步。

Ref

  1. https://segmentfault.com/a/1190000022904663
  2. https://blog.csdn.net/tongdanping/article/details/79647337
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中的synchronized锁升级是为了提高多线程并发执行的性能和效率。它通过在锁的使用过程中进行优化和升级来实现。 在Java中,synchronized锁的升级主要涉及三个层面:Java层面、字节码层面和JVM层面(对象头)。 在Java层面上,synchronized锁的升级包括以下几种状态: 1. 无锁状态:多个线程可以同时进入临界区,没有互斥的限制; 2. 偏向锁状态:当只有一个线程访问临界区时,偏向锁可以减少锁的竞争; 3. 轻量级锁状态:多个线程竞争同一个锁时,锁会升级为轻量级锁,通过CAS操作来实现快速的加锁和解锁; 4. 重量级锁状态:多个线程竞争同一个锁时,锁会升级为重量级锁,使用操作系统的互斥量来实现线程的阻塞和唤醒[1]。 在字节码层面上,synchronized同步代码块的锁升级实际上是通过字节码指令来实现的。当进入同步代码块时,会通过monitorenter指令获取锁,在退出同步代码块时,会通过monitorexit指令释放锁。这些指令可以保证临界区的原子性和互斥性,从而实现线程的同步。 在JVM层面上,synchronized锁的升级是通过对象头中的标记位来实现的。对象头中的标记位包括了锁标志位、线程ID和指向锁记录的指针。通过这些标记位,JVM可以判断锁的状态和竞争情况,从而进行锁的升级和降级。 总结来说,Java中的synchronized锁升级是为了提高多线程并发执行的性能和效率。它通过在不同层面上对锁进行优化和升级来实现线程的同步和互斥,从而保证临界区的原子性和正确性。这些优化和升级包括了无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值