JUC-公平锁和非公平锁

        // 默认非公平锁 true表示公平锁
        ReentrantLock lock = new ReentrantLock(); 

 

公平锁:按序排队,会判断同步队列是否还有前驱节点存在,如果没有前驱节点才能获取锁;

非公平锁:先占先得,不管有没有前驱节点,只要能抢到锁就可以

为什么会有公平锁和非公平锁?为什么默认非公平锁?

1、恢复挂起的线程到真正锁的获取还是有时间差的,从开发人员来看这个时间微乎其微,但是从cpu的角度来看,这个时间差还是很明显的,所以非公平锁能更充分地利用cpu的时间片,尽量减少cpu空闲状态时间。

2、使用多线程很重要的考量点是线程切换的开销,当采用非公平锁时,当一个线程请求锁获取同步状态,然后释放同步动态,因为不需要考虑是否还有前驱节点,所以刚释放锁的线程在此刻再次获取同步状态的概率非常大,所以就减少了线程切换的开销。

非公平锁的问题?

可能会出现锁饥饿现象:可能导致排队的长时间在排队,没有机会获取到锁。

什么时候用公平?什么时候用非公平?

如果要提高吞吐量,显然是非公平锁更合适,因为避免了很多线程切换的开销,吞吐量自然就上去了;否则就使用公平锁,大家公平使用。

 进微信群和大佬面对面学习交流👇🏻👇🏻👇🏻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值