搜索

首页  >  问答  >  正文

并发 - 关于Java AbstractQueuedSynchronizer 类的enq 方法

高手好,这几天研究AbstractQueuedSynchronizer 底层遇到一个问题,如图 上面有个一个关于 enq进入队列问题
然后自己想画一下这个双向链表可是不知道如何画 因为head与t是同一个对象 然后tail 与 node同一个对象 不知道该怎么画,请高手帮忙看下 在此谢过

迷茫迷茫2783 天前802

全部回复(3)我来回复

  • 大家讲道理

    大家讲道理2017-04-18 10:30:37


    @dj郑豆浆 不知道这个对不对 根据debug设计的 然后出对是t 而不是node 不知道你是不是也表达这个意思

    回复
    0
  • 阿神

    阿神2017-04-18 10:30:37

    单纯的enq感觉和并发并没什么关系,只是双向链表的建立。java里的链表和C++中并没什么不同,只是java将pointer封装成了reference,实际上起的依然是pointer的作用。
    Node t可以抽象地看成新插入节点的前一个节点,在队列中先入先出,自然新节点是在队尾插入的,所以Node t = tail。先不考虑空队列的情况,一个队列有节点入队,先处理好该新节点的pre, next,所以node.pre = tail; node.next = null;。然后将前一个节点的next指向新节点,也就是node,t.next = node。接下来考虑空队列,这里强行用一个new Node()初始化了队列,此时tail == head。至于没有将新插入节点继续插入,我不了解这样做的原因,直觉上,compareAndSetHead(node)更正常一点。
    当然,没有像单线程队列直接改变pre, next值,而是封装到comapreAndSet*函数中,多线程的互斥应该是在这里维护的。

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:30:37

    哈,那个enq方法,你现在应该是看不懂的,没专门学过的话,估计没几个人看得懂。要学无锁同步,是多线程中的很高级的内容了。

    回复
    0
  • 取消回复