关于ReentrantLock公平锁和非公平锁

公平锁和非公平锁都是存在等待队列的,在等待队列中都是按照入队的先后顺序去重新尝试获取锁的,但是区别是:
非公平锁,会在入队之前直接尝试去获取锁,也就是抢占,非公平,如下,

if (!tryAcquire(arg) && // 先获取
	acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) // 再加队
	selfInterrupt();
}

但是公平锁是会先判断队列是不是空,如果非空,则直接加队,如下,

if (!hasQueuedPredecessors() &&
	compareAndSetState(0, acquires)) {
	setExclusiveOwnerThread(current);
	return true;
}

所以,公平锁是绝对的公平,但是非公平锁他也并非完全不公平,虽然如此,但是如果某些线程频繁地尝试获取锁并且总是在其他线程(比如等待队列里的线程)前面获取锁,那么其他线程还是可能会因此而产生饥饿问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值