syncronized锁升级与锁优化

一、synchronized锁升级

无锁->偏向锁->轻量级锁->重量级锁

1.无锁

没有开启偏向锁时的状态,在JDK1.6之后偏向锁的默认开启的,但是有一个偏向延迟,默认启动后 4 秒才开启偏向锁,可以通过JVM参数进行设置,是否开启偏向锁也可以通过JVM参数设置。

2.偏向锁

当线程第一次获取锁时,JVM 会在对象头中记录这个线程的 ID,后续该线程再进入同步块时,直接判断线程ID跟对象头中MarkWord中存储的线程ID进行比较,如果是,就无 CAS、无竞争,直接进入。

3.轻量级锁

当另一个线程也尝试获取偏向锁时,JVM 会撤销偏向锁,并升级为轻量级锁。轻量级锁通过 CAS 自旋来尝试获取锁,不会立即阻塞。

4.重量级锁

当有两个以上的线程获取锁时或线程自旋获取锁失败时,轻量级锁就会升级为重量级锁。此时,其他抢不到锁的线程会被挂起,等待唤醒。因为CAS如果没有成功的话始终都在自旋,进行while循环操作,这是非常消耗CPU的。

二、synchronized锁优化

1.锁升级

无锁->偏向锁->轻量级锁->重量级锁的升级过程。JDK 1.6 之前,synchronized 是重量级锁,在释放和获取锁时都会从用户态转换成内核态,效率比较低。锁升级机制大幅降低了单线程和低竞争场景下的开销,提高性能

2.锁消除

JVM 编译器在分析后,如果发现同步块的对象没有共享或竞争的可能性,会去掉无用的锁,从而提高程序性能,如访问线程私有变量的同步块

3.锁粗化

将多个连续的加锁、解锁操作合并为一个更大的同步块,减少加锁和释放的次数,如循环中频繁加锁操作

4.自适应自旋锁

当获取锁失败时,线程不会立即阻塞,而是自旋尝试获取锁,避免线程挂起/恢复带来的用户态 ↔ 内核态切换开销,提高性能,同时JVM 会根据前一次锁的持有时间动态调整自旋次数,减少无效自旋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值