在ThreadLocal中使用WeakHashMap是个好主意

时间:2014-01-22 20:14:13

标签: java weak-references

对于我的用例,我必须从应用程序的不同层/组件传递相当多的上下文信息。由于很少有组件是离散的,我想用ThreadLocal来存储这样的上下文信息。在响应写回用户之前,我有一个拦截器/过滤器来清理它。现在,我的问题是,在WeakHashMap中使用ThreadLocal是否是个好主意(请参阅下面的代码段)?


    private static final ThreadLocal<Map<String, Object>> context = new ThreadLocal<WeakHashMap<String, Object>>();

我心中的疑问(由于我对Java中的弱引用的了解有限),弱引用可以返回NULL(因为GC按照自己的意愿收集它们)。

请帮助我理解这一点。我应该使用强大的引用,例如HashMapConcurrentHashMap,还是我的实施很好用?

1 个答案:

答案 0 :(得分:0)

WeakHashMap州的Javadoc:

  

此类主要用于密钥对象,其等于方法使用==运算符测试对象标识。一旦丢弃了这样的密钥,它就永远不会被重新创建,因此以后不可能在WeakHashMap中查找该密钥,并且对其条目已被删除感到惊讶。这个类可以很好地处理其equals方法不基于对象标识的关键对象,例如String实例。但是,使用这种可重新生成的密钥对象,自动删除其密钥被丢弃的WeakHashMap条目可能会让人感到困惑。

因此,如果您无法容忍随机消失的条目,那么您真的不应该使用WeakHashMap String密钥。