WeakHashMap <integer,vector <iconsumer =“”>&gt;,如果只对IConsumers进行强引用,会收集Vector吗?</integer,>

时间:2012-01-26 10:31:16

标签: java multithreading garbage-collection weak-references producer-consumer

我有一个对象Producer,它在内部启动一个线程来监听一些网络事件,并且大多数情况下阻塞receive()方法。在这个Producer对象中,我有一个WeakHashMap<Integer, Vector<IConsumer>>包含哈希映射,其中键是Producer可以生成的事件,值是已在这些事件上注册的使用者列表。

现在我有一个Main对象构造了一些ManagerManager构建了一个Producer和任意数量的ConcreteConsumers implements IConsumerManager包含对ProducerConcreteConsumer的引用。

这是一个有效的结构,Vector<IConsumer>插入WeakHashMap<Integer, Vector<IConsumer>>后,Producer是否不符合GC的条件,因为没有参考实际的向量?仅直接引用ConcreteConsumerMain。如果是这样,我该如何解决?


接下来发生的事情是Manager对象删除了对ConcreteConsumers的引用,这会导致所有Producer符合GC的条件,这就是我想要的。

但是,我还希望实际的{{1}}对象符合GC条件,并且内部线程在此时停止执行。有关如何执行此操作的任何建议吗?

1 个答案:

答案 0 :(得分:2)

这是WeakHashMap中具有弱引用的关键。该值被强烈引用。在没有对密钥的强引用后,该条目将被删除,在这种情况下为Integer。这是Integer的完全相同的实例,而不仅仅是具有相同值的实例。值类型作为WeakHashMap的键不是特别有用。

WeakHashMap作为缓存无用(您希望使用SoftReference s,可能还有其他人的库)。)