我最近看到一段代码,它使用了ThreadLocal
对象并在其中保留了ConcurrentHashMap
这有什么逻辑/好处吗,还是多余的?
如果对并发哈希映射的仅引用位于ThreadLocal
中,则该哈希映射显然仅从单个线程引用。在这种情况下,我认为这是完全多余的。
然而,不难想象有人会与其他线程"共享"本地存储的线程哈希图:
ThreadLocal<ConcurrentHashMap<String, String>> tl = ...
// ...
final ConcurrentHashMap<String, String> props = tl.get();
EventQueue.invokeLater(new Runnable() {
public void run() {
props.add(key.getText(), val.getText());
}
});
要么是他用错了ThreadLocal
,要么是ConcurrentHashMap
。组合有意义的可能性接近于0。
除了@aiobe所说的,还可以考虑InheritableThreadLocal
的情况,其中local的值从一个线程传递到它创建的每个子线程。
正如@pst所说,没有什么可以阻止在不同的(不可继承的)ThreadLocal
s中使用相同的值。
简而言之,您必须对线程局部变量、它们的初始化方式和使用方式进行彻底的分析,然后才能安全地得出结论,认为它们不需要是线程安全的。