首页 > 其他分享 >ReentrantLock的锁竞争是否排队判断

ReentrantLock的锁竞争是否排队判断

时间:2022-11-25 16:56:15浏览次数:42  
标签:结点 ReentrantLock 排队 next 竞争 判断 线程 null

 

    public final boolean hasQueuedPredecessors() {
        // The correctness of this depends on head being initialized
        // before tail and on head.next being accurate if the current
        // thread is first in queue.
        Node t = tail; // Read fields in reverse initialization order
        Node h = head;
        Node s;
        return h != t &&
            ((s = h.next) == null || s.thread != Thread.currentThread());
    }
View Code

 

这个方法是用来判断线程是否需要排队的(返回false不需要排队),因为是公平锁,所以这个判断是必须的,否则就不公平了,因为没有判断排队操作,那么只要一个线程释放了锁,那么后来的线程也是可以抢到的(透露一下:非公平锁的实现就是仅仅少了这个判断而已)

公平锁竞争锁是否需要排队:

步骤如下:

判断头结点是否等于尾结点,只有在初始化的时候,头结点才会等于尾结点,或者队列为空,头尾结点都为null,所以,如果头结点等于尾结点(直接返回false),就代表了队列为空,所以就不需要进行排队

通过第一个判断就已经知道头尾结点之间是有其他结点存在的,但由于前面的enq方法是先处理头结点的,然后除了两个CAS操作之外,其他都不是原子性的,也就是基本上整个enq方法都不是原子性的,所以当正在插入第一个线程的时候,会出现一个h.next == null的问题(这时已经代表有一个线程正在插入了,但还没完成插入,所以当前线程需要排队),所以当h.next == null时就代表要排队

最后一个判断就是判断头结点的下一个线程是不是当前线程(也就是下一个是不是轮到你,不需要排队,因为插入方法是尾插法,所以弹出方法要从头弹出),经过前面两次判断,可以得知队列中有人在排队,并且此时并不存在队列第一次插入结点的Null问题,那么最后就需要判断下一个是否轮到当前线程

参考链接:

https://blog.csdn.net/AK774S/article/details/124664227

 

标签:结点,ReentrantLock,排队,next,竞争,判断,线程,null
From: https://www.cnblogs.com/xdlrf/p/16925670.html

相关文章

  • ZWS物联网云平台为电器设备智能化,提升产品竞争力
    从目前的消费趋势来看,家居电器设备的消费发力点在于年轻人。他们基本由“80”、“90后”组成,对于消费理念更加的新颖,对于新产品与新观念更加容易接受。不过相对的,他们对于......
  • 【EsDA应用】在竞争激烈的HMI产品中,如何抢得市场先机?
    摘要  HMI人机界面,已成为嵌入式产品中的重要的一环,为客户带来最直观的体验。一个高效且优质的HMI解决方案,能让产品在激烈的竞争中取得巨大的优势。1.HMI是什么?......
  • 牛客小白月赛61 E.排队(组合数学)
    题目大意:对于n个数,求其所有可能排列中的逆序数之和解题思路:求每种排列逆序数之和,因为数字的顺序在变化,这对我们去计算总和很不利,所以我们转换思路我们可以先考虑数对(a......
  • ReentrantLock测试
     博客:https://www.jianshu.com/p/7058c21e615epublicstaticvoidmain(String[]args){test3();}publicstaticvoidtest1(){Ru......
  • Java 同步锁ReentrantLock与抽象同步队列AQS
    AbstractQueuedSynchronizer抽象同步队列,它是个模板类提供了许多以锁相关的操作,常说的AQS指的就是它。AQS继承了​​AbstractOwnableSynchronizer​​类,AOS用于保存线程对......
  • Java 同步锁ReentrantLock与抽象同步队列AQS
    AbstractQueuedSynchronizer抽象同步队列,它是个模板类提供了许多以锁相关的操作,常说的AQS指的就是它。AQS继承了​​AbstractOwnableSynchronizer​​类,AOS用于保存线程对......
  • P8841 [传智杯 #4 初赛] 竞争得分 ----- 归一化*100
    题目描述为了鼓励大家写出更好的作业,花栗鼠科技大学(HualishuUniversityofScienceandTechnology,HUST)的组原实验采用了竞争得分的方式。具体来说,假设有 nn 个人......
  • 排队
    排队$n$个小朋友排成一排,从左到右依次编号为$1\simn$。第$i$个小朋友的身高为$h_i$。虽然队伍已经排好,但是小朋友们对此并不完全满意。对于一个小朋友来说,如果......
  • 图解ReentrantLock底层公平锁和非公平锁实现原理
    ......
  • 【Java】Synchronized与ReentrantLock区别总结
    这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍。相似点:这两种同步方式有很多相似之处,它们......