【发布时间】:2011-02-02 13:55:29
【问题描述】:
我有一个多线程应用程序正在写入和读取 ConcurrentLinkedQueue,它在概念上用于支持列表/表中的条目。我最初为此使用了 ConcurrentHashMap,效果很好。一项新要求要求跟踪输入的订单条目,因此可以根据某些条件以最旧的第一顺序删除它们。 ConcurrentLinkedQueue 似乎是一个不错的选择,而且它在功能上运行良好。
可配置数量的条目保存在内存中,当达到限制时提供新条目时,将按最早的优先顺序搜索队列以查找可以删除的条目。某些条目不会被系统删除并等待客户端交互。
似乎正在发生的事情是我在发生的队列前面有一个条目,比如 100K 条目之前。队列似乎配置的条目数量有限(size() == 100),但在分析时,我发现内存中有 ~100K ConcurrentLinkedQueue$Node 对象。这似乎是设计使然,只需查看 ConcurrentLinkedQueue 的源代码,remove 只会删除对正在存储的对象的引用,但会保留链表以供迭代。
最后我的问题是:有没有一种“更好”的懒惰方式来处理这种性质的集合?我喜欢 ConcurrentLinkedQueue 的速度,我无法承受在这种情况下似乎可能出现的无限泄漏。如果没有,我似乎必须创建第二个结构来跟踪订单,并且可能存在相同的问题,以及同步问题。
【问题讨论】:
-
如果您在此处找不到答案,请转至altair.cs.oswego.edu/mailman/listinfo/concurrency-interest 并在此处发布您的问题。想必ConcurrentLinkedQueue的作者会给你一个果断的答案。
标签: java concurrency heap-memory java.util.concurrent