java并发学习13:轻量级锁

1、轻量级锁

使用场景:

如果一个对象虽然有多线程访问,但多线程访问的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化

轻量级锁对使用者是透明的,即语法仍然是synchronized

假设有两个方法同步块,利用同一个对象加锁

static final Object obj = new Object();
public static void method1() {
	synchronized(obj) {
    	//同步块A
        method2();
    }
}
public static void method2() {
    synchronized(obj) {
        //同步块B
    }
}
  • 创建锁记录(Lock Record)对象,每个线程的栈帧都会包含一 个锁记录的结构,内部可以储存锁定对象的Mark Word

在这里插入图片描述

  • 让锁记录中Object reference 指向锁对象,并尝试用cas替换Object 的Mark Word,将Mark Word 的值存入锁记录

在这里插入图片描述

  • 如果cas替换成功,对象头中存储了锁记录地址和状态00,表示由该线程给对象加锁,这时图示如下

在这里插入图片描述

  • 如果cas失败,有两种情况

    • 如果是其它线程已经持有了该Object的轻量级锁,这时表明有竞争,进入锁膨胀过程
    • 如果是自己执行了synchronized锁重入,那么再添加一条Lock Record作为重入的计数

在这里插入图片描述

  • 当退出synchronized代码块(解锁时)如果有取值为null代锁记录,表示有重入,这时重置记录,表示

重入计数减一

在这里插入图片描述

  • 当退出synchronized代码块(解锁时)锁记录的值不为null,这时使用cas将Mark Word的值恢复给对象头
    • 成功,则解锁成功
    • 失败,说明轻量级锁进行了锁澎湃或已经升级为重量级,进入重量级锁解锁流程
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值