Java 在ThreadLocal中使用WeakHashMap是一个好主意吗

Java 在ThreadLocal中使用WeakHashMap是一个好主意吗,java,weak-references,Java,Weak References,对于我的用例,我必须从应用程序的不同层/组件传递相当多的上下文信息。因为很少有组件是离散的,所以我想使用ThreadLocal来存储这样的上下文信息。我有一个拦截器/过滤器,在将响应写回用户之前对其进行清理。现在,我的问题是,在ThreadLocal内部使用WeakHashMap是否是一个好主意(请参见下面的代码片段) private static final ThreadLocal context=new ThreadLocal(); 我心中的疑问(我对Java中的弱引用了解有限)是,弱引

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


private static final ThreadLocal context=new ThreadLocal();
我心中的疑问(我对Java中的弱引用了解有限)是,弱引用可以返回NULL(因为GC根据自己的意愿收集它们)


请帮助我理解这一点。我应该使用像
HashMap
ConcurrentHashMap
这样的强引用,还是我的实现很好用?

用于
WeakHashMap
的Javadoc声明:

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


因此,如果您不能容忍条目随机消失,那么您真的不应该使用
String
键的
WeakHashMap

使用
WeakHashMap
不是一个好主意。你好,Marko,感谢您的回复;你有什么文件和资料可以让我查阅吗?

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