轻量级锁及其升级为重量级锁的过程

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

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

java中synchronized默认是轻量级锁,但当有线程在同一时间发生锁竞争时,轻量级锁会升级为重量级锁Monitor

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

static final Object lock = new Object();
public static void method1() {
  synchronized( lock ) {
    // 同步块 A
    method2();
  }
}
public static void method2() {
  synchronized( lock ) {
 	 // 同步块 B
  }
}

以下为个人理解:

  • 当方法1先进入锁执行的时候,会将自己的 锁l地址和 lock对象的地址值进行一次交换,轻量级锁的地址值后两位为00 , lock对象的地址值为hashcode计算的值
  • 当单个线程执行时,方法2也进入锁执行的时候,因为是同一个线程,所以开辟的内存空间是一样的,它不会再进行地址值的交换, 此时记录的地址值为null ,并且对lock Record进行加1,作为重入的计数
  • 当退出synchronize 代码块(解锁时)如果有取值为null的锁记录,表示有重入,这时重置锁记录,表示重入计数-1 (减去一条lock record)

以下为专业解释:

  • method1 执行到synchronized( lock ) 创建锁记录(Lock Record)对象的,每个线程的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的Mark Word
  • 让锁记录的对象指针(Object reference)指向锁对象,并尝试用 cas 替换 Object 的 Mark Word ,将Mark Word的值存入锁记录(01 表示无锁状态 [01 还有偏向锁状态] 、00 轻量级锁状态)
  • 如果 cas 替换成功 ,对象头中存储了 锁记录的地址 和状态 00,表示由改线程给对象加锁了

 

  • 如果cas 失败了 则有2种情况

1.如果其他线程已经持有以了该Object的轻量级锁,这时表明有锁竞争,进入锁膨胀的过程(可看锁膨胀图解)

2.如果是自己执行了synchronize锁重入(method2 执行到synchronized( lock ) ),那么再添加一条lock Record作为重入的计数

 

        当退出synchronize 代码块(解锁时)如果有取值为null的锁记录,表示有重入,这时重置锁记录,表示重入计数-1 (减去一条lock record)

 

  • 当退出synchronize 代码块(解锁时)锁记录的值不为null,这时使用cas将Mark Word 的值恢复给对象头

    • 成功 : 解锁成功
    • 失败:说明轻量级锁进行了锁膨胀或者已经升级为重量级锁,进入重量级锁流程

Java中,轻量级是一种用于提高多线程同步性能的机制。它是基于对象头部的标记位来实现的。当一个线程尝试获取一个被轻量级保护的对象时,会将对象头部的标记位设置为定状态,然后将线程ID保存在对象头部。如果其他线程也想获取同一个对象的轻量级,它们会尝试使用CAS(比较并交换)操作来竞争。 但是,如果这个竞争过程中存在激烈的竞争或者加操作失败的次数达到一定阈值,那么轻量级就会升级重量级升级重量级意味着的状态会从对象头部移动到操作系统的内核态,并且会涉及到用户态和内核态之间的切换,这个过程轻量级更消耗系统资源。 轻量级锁升级重量级的条件包括但不限于以下情况: 1. 竞争激烈:多个线程频繁竞争同一个对象的。 2. 自旋超过阈值:自旋是指线程在获取时不放弃CPU时间片,而是反复尝试获取。如果自旋的次数超过一定的阈值,说明竞争很激烈,此时轻量级升级重量级。 3. 膨胀失败:如果在自旋过程中,有其他线程成功获取了同一个对象的轻量级,那么当前线程的轻量级升级重量级。 需要注意的是,轻量级升级是由JVM自动完成的,开发者无需手动干预。并且,轻量级的性能通常比重量级要好,在竞争不激烈的情况下可以有效提高程序的执行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值