【问题标题】:Java ArrayList referenceJava ArrayList 参考
【发布时间】:2014-11-22 23:30:26
【问题描述】:

我正在使用泛型创建对象的 ArrayList。每个线程都会计算对象并将其存储在数组列表中。

但是,当查看静态和易失的 ArrayList 时,所有对象属性都设置为空。我的想法与垃圾收集器删除线程中的实例有关,因此一旦线程完成,就没有对它们的引用。

任何帮助真的很有帮助吗?

【问题讨论】:

  • 你能发布一些示例代码吗?
  • 垃圾收集器从不“清空”变量或以其他方式更改对象。 null 的值要么是显式分配的,要么是默认值。现在,使用来自多个线程的 ArrayList 本质上是有问题的 - 至少不使用 synchronized
  • 你的想法是错误的。
  • 目前我正在测试它,并且在同一个线程中我可以执行 topDesigns.getList().get(0).isEvaluated() 。 (其中 getList() 返回 ArrayList 和 isEvaluated() 检查对象是否具有状态(值!= null)和 getValue() 返回值。它在线程中返回 true,但一旦线程退出并返回到主线程所有对象的值都变为null。

标签: java multithreading arraylist


【解决方案1】:

垃圾收集器不会从数组列表中删除实例1。这不是问题。

问题很可能是您在没有正确同步的情况下访问和更新数组列表对象。如果您没有正确同步,一个线程不会总是看到另一个线程所做的更改。

声明对ArrayList 对象的引用仅保证线程将看到相同的列表对象引用。它不保证列表对象上的操作会发生什么。


1 - 假设 GC 运行时数组列表可达,那么所有已正确添加到列表中的元素也将可达。垃圾收集器不会删除任何可达的内容。此外,GC 永远不会到达您的应用程序仍然可以看到的对象并将普通引用更改为 null

【讨论】:

    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多