◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
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 收集器已不再使用。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。