何谓公平锁与非公平锁

阅读: 评论:0

何谓公平锁与非公平锁

何谓公平锁与非公平锁

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁
非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

优点缺点
公平锁所有线程都会获得锁,不会饿死要唤醒阻塞的线程,CPU唤醒线程开销大
吞吐量下降
不公平锁减少CPU唤醒线程的开销
吞吐效率较高
多个线程竞争,可能由于抢不到锁导致饿死

在ReentrantLock章节,其实涉及到了公平锁与非公平锁,下面我们来回顾一下


我们平时new 的ReentrantLock的时候,它的底层就使用了公平锁和非公平锁

public ReentrantLock() {sync = new NonfairSync();//默认是非公平锁}
public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();}

细看公平锁与非公平锁的源码,发现都继承了ReentrantLock的内部类Sync,而Sync继承AQS(AbstractQueuedSynchronizer)
公平锁与非公平锁的主要的处理逻辑在tryAcquire方法上,而唯一的不同就在于公平锁多了一个hasQueuedPredecessors方法的判断 。

    protected final boolean tryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();//返回当前同步的状态值if (c == 0) {if (!hasQueuedPredecessors() &&compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}}else if (current == getExclusiveOwnerThread()) {int nextc = c + acquires;if (nextc < 0)throw new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;}}

进入hasQueuedPredecessors方法,看看是怎么一回事

   public final boolean hasQueuedPredecessors() {Node t = tail; // Read fields in reverse initialization orderNode h = head;Node s;return h != t &&((s = h.next) == null || s.thread != Thread.currentThread());}

大概意思就是判断当前线程是否是在同步队列的头部,是返回true,不是返回false
因为公平锁是同步队列的首部才可以获取锁,所以才多了一个判断,非公平锁不需要

本文发布于:2024-02-02 09:24:52,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170683709142863.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:公平   与非
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23