84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
高手好,这几天研究AbstractQueuedSynchronizer 底层遇到一个问题,如图 上面有个一个关于 enq进入队列问题然后自己想画一下这个双向链表可是不知道如何画 因为head与t是同一个对象 然后tail 与 node同一个对象 不知道该怎么画,请高手帮忙看下 在此谢过
业精于勤,荒于嬉;行成于思,毁于随。
@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方法,你现在应该是看不懂的,没专门学过的话,估计没几个人看得懂。要学无锁同步,是多线程中的很高级的内容了。
@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方法,你现在应该是看不懂的,没专门学过的话,估计没几个人看得懂。要学无锁同步,是多线程中的很高级的内容了。