Java中线程锁机制是怎样的?偏向锁,轻量级锁,重量级锁有什么区别?锁机制是如何升级的?

目录

偏向锁(Biased Locking):

轻量级锁(Lightweight Locking):

重量级锁(Heavyweight Locking):

锁的升级过程:


Java中的线程锁机制包括偏向锁(Biased Locking)、轻量级锁(Lightweight Locking)和重量级锁(Heavyweight Locking)。这些锁机制是为了在多线程并发访问时保证数据的一致性和防止竞态条件而设计的。它们的区别和升级过程如下所示:

偏向锁(Biased Locking):

  • 偏向锁是为了在无竞争的情况下提高性能而设计的。当只有一个线程访问临界区,会将锁对象记录在当前线程的栈帧的锁记录中,并标记为偏向锁。
  • 当另一个线程尝试获取偏向锁时,会检查原来的偏向锁是否已经被其他线程获取,如果没有,升级为轻量级锁;如果有,撤销偏向锁并尝试使用CAS(Compare And Swap)操作进行轻量级锁的升级。

轻量级锁(Lightweight Locking):

  • 当出现多个线程争用同一把锁时,会升级为轻量级锁。轻量级锁使用CAS操作来对锁定标志位进行操作,尝试用自旋来获取锁。
  • 如果自旋失败,说明存在竞争,锁会膨胀为重量级锁。

重量级锁(Heavyweight Locking):

  • 当多个线程长时间竞争同一把锁,锁会膨胀为重量级锁。重量级锁会使其他线程阻塞挂起,并进入内核态调度。

锁的升级过程:

  1. 默认情况下,对象刚创建时是无锁的状态。
  2. 当某个线程第一次访问同步块时,会升级为偏向锁,如果没有竞争发生,此线程再次进入同步块时不需要再进行同步操作,可直接访问。
  3. 当有多个线程访问同步块时,偏向锁升级为轻量级锁,采用CAS操作进行锁的操作。
  4. 若仍有线程竞争,轻量级锁将会升级为重量级锁,此时会阻塞其他竞争锁的线程。

这些锁机制的设计和升级过程都是为了尽可能减少锁升级的代价,当并发条件并不十分激烈时,能够提供更高的性能。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值