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