ホームページ  >  に質問  >  本文

并发 - 关于Java AbstractQueuedSynchronizer 类的enq 方法

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

迷茫迷茫2761日前788

全員に返信(3)返信します

  • 大家讲道理

    大家讲道理2017-04-18 10:30:37


    @dj Zheng Doijiu これが正しいかどうかはわかりませんが、デバッグに基づいて設計されており、正しい出力はノードではなく t です。この意味も表現しているかどうかはわかりません。

    返事
    0
  • 阿神

    阿神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
    * 関数にカプセル化されています。

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:30:37

    ああ、その enq メソッドは今は理解できないでしょう。具体的に学習していなければ、理解できる人はほとんどいないと思います。ロックフリー同期の学習は、マルチスレッドの非常に高度な部分です。

    返事
    0
  • キャンセル返事