[Java]synchronized的内部实现策略

文章详细阐述了Java中synchronized的锁升级策略,包括偏向锁、轻量级锁和重量级锁,以及锁的消除和粗化。偏向锁是一种乐观锁策略,轻量级锁采用自旋锁,而重量级锁会导致线程挂起等待。此外,文章还提到编译器的锁消除优化和在特定情况下锁粗化提高效率。
摘要由CSDN通过智能技术生成

synchronized在六种锁策略中既是乐观锁又是悲观锁,既是轻量锁也是重量锁,既是自旋锁又是挂起等待锁,是互斥锁,是非公平锁,是可重入锁。

一、锁升级策略

(1)偏向锁

使用synchronized对一个未被加锁的对象加锁时,synchronized首先是对这个对象加一个偏向锁,偏向锁只是对这个对象加一个标号,并不直接加锁。当一个其他线程尝试对这个对象进行加锁时,此时偏量锁就会立刻升级成轻量级锁,真正的进行加锁,其他线程只能阻塞。

偏向锁是乐观锁策略。

(2)轻量级锁

轻量级锁是自旋锁,偏量锁升级后,被阻塞的线程的synchronized也升级成自旋锁,此时被阻塞的线程会一直循环判断这个锁时候被释放,被释放了就马上获取锁。

当然并不能一直这样循环判断,自旋也是有开销的,当自旋了一段时间后,锁还没被释放,自旋锁就会升级成重量锁。

(3)重量级锁

升级成重量级锁后,阻塞线程会直接挂起等待,直到锁被释放然后主动唤醒这个线程获取到锁。

二、锁消除策略

编译器会自动判断代码加锁的地方是否需要加锁,如果在不需要加锁的地方加了锁,编译器会把这个锁消除,运行时就不会再加锁。

三、锁粗化

锁粒度:就是加锁代码块的长度,代码块越长锁粒度越大。

一般情况下,锁的粒度是越小越好,毕竟加了锁的代码块就不能并发执行,影响了并发的程度,但是如果两个加锁的代码块挨得很近,中间只有几句代码,其实不如直接将整个代码都加锁,因为加锁和解锁也是有开销的。自动把两个锁合成一个锁就是锁粗化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值