并发 - 关于Java AbstractQueuedSynchronizer 类的enq 方法
迷茫
迷茫 2017-04-18 10:28:37
0
3
799

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

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
大家讲道理


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

Peter_Zhu

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板