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にはどのように役立つのですか?
[java.util.concurrent.LinkedBlockingQueueで奇妙なコード]の可能重複ます(http:// stackoverflowの.com/questions/8819342/strange-code-in-java-util-concurrent-linkedblockingqueue) – artbristol
これらは関連している可能性がありますが、util.concurrentは他の質問で多くの場所で言及されている同じ種類のコード(つまり、メンバー変数のローカルコピーを作成してください)、私はそれらが異なる問題だと思うようになります。彼らが実際に関連していれば面白いだろう! – kanak