LinkedBlockingQueue 中 h.next = h 的作用是什么?

linkedblockingqueue 中 h.next = h 的作用是什么?

linkedblockingqueue 源码疑惑

在 linkedblockingqueue 的源码中常会看到以下代码:

Node<E> h = head;
Node<E> first = h.next;
h.next = h; // help GC

这行代码的目的是帮助垃圾回收器(gc)减少浮动垃圾的产生。

浮动垃圾是指不再可达(从 gc 根节点无法访问)但尚未被 gc 回收的对象。在并发的 gc 场景中,当线程正在遍历链表并持有对链表元素的引用时,可能会产生浮动垃圾。如果 gc 此时回收了这些元素,会导致遍历过程出错。

h.next = h 这行代码将 head 节点的 next 引用指向自身,形成一个循环引用。这使得 gc 无法通过 head 节点访问链表中的其他元素,从而避免了上述场景。因此,可以减少浮动垃圾的产生,提高 gc 效率。

值得注意的是,该代码仅在 openjdk 6 及更新版本中使用,因为从 openjdk 7 开始,cms 收集器已不再使用。

以上就是LinkedBlockingQueue 中 h.next = h 的作用是什么?的详细内容,更多请关注其它相关文章!