JAVA锁升级(锁膨胀)的过程

本文介绍了JAVA锁升级的过程,从无锁、偏向锁、轻量级锁(自旋锁)到重量级锁。无锁在没有锁竞争时效率高,偏向锁在单线程访问时避免加锁,轻量级锁通过自旋尝试获取锁,当自旋超过阈值或线程数过多则升级为重量级锁,涉及对象头的MarkWord状态变化。
摘要由CSDN通过智能技术生成

JAVA锁升级(锁膨胀)的过程

1.背景

在jdk获取锁的前期,需要jvm向内核申请,需要计算机内核参与,因此获取锁和释放锁的成本大大提高;在jdk1.6之后有所优化,但是为了提高锁的效率,锁升级还是大大的有必要。锁只能升级不能降级,升级的策略是为了提高锁的效率。

jdk1.6之后锁分四种状态:无锁 → 偏向锁 → 轻量级锁 → 重量级锁

2.概念

2.1.无锁

程序不会有锁的竞争,在程序设计不需要考虑锁的情况下为无锁。

2.2.偏向锁

在程序设计需要考虑锁的情况下,在运行过程中,只有一个线程访问代码块,而且还未产生多线程竞争的条件下,程序会添加一个偏向锁,标识代码块已经有线程访问,当同一个线程再次访问时,可以跳过加锁操作,由于之前没有释放锁,这里也就不需要重新加锁。如果自始至终使用锁的线程只有一个,很明显偏向锁几乎没有额外开销,性能极高。

如果运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。一旦有第二个线程加入锁竞争,偏向锁就升级为轻量级锁(自旋锁)。升级为轻量级锁的时候需要撤销偏向锁,撤销偏向锁的时候会导致STW(stop the word)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值