2

OpenJDKのLinkedBlockingQueue(java.util.concurrent内)の実装で、Nodeクラスの構造が少し混乱しています。私は以下のノードクラスの記述を再現しましたOpenJDKのLinkedBlockingQueueの実装:NodeクラスとGC

static class Node<E> { 
    E item; 

    /** 
    * One of: 
    * - the real successor Node 
    * - this Node, meaning the successor is head.next 
    * - null, meaning there is no successor (this is the last node) 
    */ 
    Node<E> next; 

    Node(E x) { item = x; } 
} 

を具体的に、私は次の(「後継者がhead.nextある意味、このノード、」)のための第二選択に困惑しています。

これは直接のように見えるデキュー方法に関連すると思わ:

private E dequeue() { 
    // assert takeLock.isHeldByCurrentThread(); 
    // assert head.item == null; 
    Node<E> h = head; 
    Node<E> first = h.next; 
    h.next = h; // help GC 
    head = first; 
    E x = first.item; 
    first.item = null; 
    return x; 
} 

だから我々は、現在の頭を削除した、と私たちは「GCを助ける」ために自分自身であることがその次を設定しています。

これはGCにどのように役立ちますか? GCにはどのように役立つのですか?

+0

[java.util.concurrent.LinkedBlockingQueueで奇妙なコード]の可能重複ます(http:// stackoverflowの.com/questions/8819342/strange-code-in-java-util-concurrent-linkedblockingqueue) – artbristol

+0

これらは関連している可能性がありますが、util.concurrentは他の質問で多くの場所で言及されている同じ種類のコード(つまり、メンバー変数のローカルコピーを作成してください)、私はそれらが異なる問題だと思うようになります。彼らが実際に関連していれば面白いだろう! – kanak

答えて

関連する問題