84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
高手好,这几天研究AbstractQueuedSynchronizer 底层遇到一个问题,如图 上面有个一个关于 enq进入队列问题然后自己想画一下这个双向链表可是不知道如何画 因为head与t是同一个对象 然后tail 与 node同一个对象 不知道该怎么画,请高手帮忙看下 在此谢过
业精于勤,荒于嬉;行成于思,毁于随。
@dj Zheng Doijiu これが正しいかどうかはわかりませんが、デバッグに基づいて設計されており、正しい出力はノードではなく t です。この意味も表現しているかどうかはわかりません。
純粋な enq は同時実行とは何の関係もなく、単に二重リンクリストを確立しているだけのように感じます。 Java のリンク リストは、Java がポインタを参照にカプセル化し、実際には依然としてポインタの役割を果たしている点を除いて、C++ のリンク リストと変わりません。 ノード t は、キューに先入れ先出しされる、新しく挿入されたノードの前のノードとして抽象的に見ることができます。当然、新しいノードはキューの最後に挿入されるため、ノード t = tail となります。 。空のキューの状況を無視すると、ノードがキューに参加する場合、新しいノードの前と次が最初に処理される必要があるため、node.pre = tail;node.next = null;。次に、前のノードの次を新しいノード、つまりノード t.next = node にポイントします。次に空のキューを考えます。このとき、tail == headでキューが強制的に初期化されます。新しく挿入したノードを挿入しないことについては、直感的には compareAndSetHead(node) の方が普通です。 もちろん、シングルスレッドキューのように pre と next の値を直接変更するわけではありませんが、ここでは comapreAndSet* 関数にカプセル化されています。
ああ、その enq メソッドは今は理解できないでしょう。具体的に学習していなければ、理解できる人はほとんどいないと思います。ロックフリー同期の学習は、マルチスレッドの非常に高度な部分です。
@dj Zheng Doijiu これが正しいかどうかはわかりませんが、デバッグに基づいて設計されており、正しい出力はノードではなく t です。この意味も表現しているかどうかはわかりません。
純粋な enq は同時実行とは何の関係もなく、単に二重リンクリストを確立しているだけのように感じます。 Java のリンク リストは、Java がポインタを参照にカプセル化し、実際には依然としてポインタの役割を果たしている点を除いて、C++ のリンク リストと変わりません。
ノード t は、キューに先入れ先出しされる、新しく挿入されたノードの前のノードとして抽象的に見ることができます。当然、新しいノードはキューの最後に挿入されるため、ノード t = tail となります。 。空のキューの状況を無視すると、ノードがキューに参加する場合、新しいノードの前と次が最初に処理される必要があるため、node.pre = tail;node.next = null;。次に、前のノードの次を新しいノード、つまりノード t.next = node にポイントします。次に空のキューを考えます。このとき、tail == headでキューが強制的に初期化されます。新しく挿入したノードを挿入しないことについては、直感的には compareAndSetHead(node) の方が普通です。 もちろん、シングルスレッドキューのように pre と next の値を直接変更するわけではありませんが、ここでは comapreAndSet
* 関数にカプセル化されています。
ああ、その enq メソッドは今は理解できないでしょう。具体的に学習していなければ、理解できる人はほとんどいないと思います。ロックフリー同期の学習は、マルチスレッドの非常に高度な部分です。