【JavaSE】偏向锁、轻量级锁和重量级锁,如何获取锁,如何撤销锁。

本文详细介绍了Java对象头及其与锁的关系,重点探讨了JavaSE中的偏向锁、轻量级锁和重量级锁的工作原理。包括偏向锁的获取、撤销和升级,轻量级锁的加锁、解锁操作,以及自适应自旋策略。文章还提到了重量级锁的阻塞和唤醒机制,并总结了这三种锁在并发控制中的应用和优缺点。
摘要由CSDN通过智能技术生成

一、java对象头

  • 锁的获取和撤销会关系到对象头,所以先来看看对象头。
  • Java对象头Mark Word字段存放内容:
    在这里插入图片描述
  • 根据竞争状态的激烈程度,锁会自动进行升级,锁不能降级(为了提高锁获取)

一、偏向锁

  • 由于老版本的内建锁synchronized存在最大的问题:在存在线程竞争的情况下会出现线程的阻塞以及唤醒带来的性能问题,这是一种互斥同步(阻塞同步)。
  • 大多数情况下,锁不仅不存在多线程竞争,而且总是由同一个线程多次获得。为了让线程获取锁的开销降低引入偏向锁。
  • JDK1.6之后引入了偏向锁的概念,偏向锁是一种乐观锁(假设所有线程访问共享资源时不会出现冲突)。

1.偏向锁的获取

  • 1.因为锁标志位为01的时候会存储线程ID,当一个线程进入同步代码块的时候判断对象头里的Mark Word是否存储着指向当前线程ID,如果有就让当前线程获得锁。(这里可以解释,当同一个线程不断重入偏向锁的时候不需要进行CAS操作,只需要进行一个判断就可以获得锁)最后执行步骤5。如果没有,则进行步骤2的判断。
  • 2.判断Mark Word中偏向锁标识是否设置为1(表示当前是偏向锁), 如果是的话指向步骤3 ,否则执行步骤4
  • 3.尝试使用CAS将对象头的偏向锁指向当前线程, 成功表示获取偏向锁成功, 则执行步骤5, 失败则表示存在竞争, 偏向锁
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值