关于Java AbstractQueuedSynchronizer 类的enq 方法

新手上路,请多包涵

图片描述

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

阅读 3.9k
3 个回答
✓ 已被采纳新手上路,请多包涵

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

单纯的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*函数中,多线程的互斥应该是在这里维护的。
图片描述

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题