对于我的用例,我必须从应用程序的不同层/组件传递相当多的上下文信息。由于很少有组件是离散的,我想用ThreadLocal
来存储这样的上下文信息。在响应写回用户之前,我有一个拦截器/过滤器来清理它。现在,我的问题是,在WeakHashMap
中使用ThreadLocal
是否是个好主意(请参阅下面的代码段)?
private static final ThreadLocal<Map<String, Object>> context = new ThreadLocal<WeakHashMap<String, Object>>();
我心中的疑问(由于我对Java中的弱引用的了解有限),弱引用可以返回NULL(因为GC按照自己的意愿收集它们)。
请帮助我理解这一点。我应该使用强大的引用,例如HashMap
或ConcurrentHashMap
,还是我的实施很好用?
答案 0 :(得分:0)
WeakHashMap
州的Javadoc:
此类主要用于密钥对象,其等于方法使用==运算符测试对象标识。一旦丢弃了这样的密钥,它就永远不会被重新创建,因此以后不可能在WeakHashMap中查找该密钥,并且对其条目已被删除感到惊讶。这个类可以很好地处理其equals方法不基于对象标识的关键对象,例如String实例。但是,使用这种可重新生成的密钥对象,自动删除其密钥被丢弃的WeakHashMap条目可能会让人感到困惑。
因此,如果您无法容忍随机消失的条目,那么您真的不应该使用WeakHashMap
String
密钥。