关于Java AbstractQueuedSynchronizer 类的enq 方法
高手好,这几天研究AbstractQueuedSynchronizer 底层遇到一个问题,如图 上面有个一个关于 enq进入队列问题
然后自己想画一下这个双向链表可是不知道如何画 因为head与t是同一个对象 然后tail 与 node同一个对象 不知道该怎么画,请高手帮忙看下 在此谢过
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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*函数中,多线程的互斥应该是在这里维护的。
哈,那个enq方法,你现在应该是看不懂的,没专门学过的话,估计没几个人看得懂。要学无锁同步,是多线程中的很高级的内容了。