Java循环引用,糟糕的风格?

标签 java memory-management reference garbage-collection

我正在研究树结构,其中事件必须能够向下传播到根元素。同时我使用访问者模式来序列化这棵树。向访问者提供对根的引用,并沿着树向上移动。

因此我需要使用某种循环引用(对于事件, child 需要知道其 parent ,对于访问者, parent 需要知道所有 child )。

class TreeNode {
    List<TreeNode> children;
    TreeNode parent;
    ...
}

我现在想分解这些循环引用。释放根节点,应该会自动释放整个树的其余部分。

我一直在试验 parent 字段的弱引用。我遇到了空指针异常,因为 java 释放了父字段,该字段随后被事件访问。

如何解决?

最佳答案

Java 垃圾回收足够聪明,不会被循环引用所愚弄。一旦没有对树的强引用,那么整个包含循环引用的树都将被垃圾收集。

您需要做的就是确保没有从树外部到树内部任何地方的引用。

如果事件正在访问父字段,则表明某些内容仍然具有引用。您将需要清理它(无论您是否删除循环引用)。

关于Java循环引用,糟糕的风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22718123/

相关文章:

multithreading - 如何最小化分配和初始化 NSDateFormatter 的成本?

Java:将对变量的引用作为方法的参数传递

c++ - 为什么 C++ 选择将我的返回值转换为 int?

java - 无法使用 Spring Boot REST 存储库在 H2 DB 中创建记录

java - 如何使用eclipse创建一个项目来编写JSP?

java - Windows 上的 Grails 出错。无法找到有效的认证

memory-management - 发生运行时 panic 时,堆栈/堆分配的类型会发生什么情况?

java - 我有一个包含 14 个值的 ArrayList,但出现 IndexOutOfBounds 异常。我检查它们是否为空并打印了值

iphone - iOS/iPhone ARC 内存管理

reactjs - Material ui popover如何锚定到另一个元素(与事件目标不同)