我最近看到一段代码使用了ThreadLocal
对象并在其中保留了ConcurrentHashMap
。
这有什么逻辑/好处,还是多余的?
答案 0 :(得分:7)
如果对并发hashmap的 only 引用驻留在ThreadLocal
中,则显然只能从单个线程引用hashmap。在这种情况下,我会说它完全是多余的。
然而,不难想象某人与其他线程“共享”线程本地存储的hashmap:
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());
}
});
答案 1 :(得分:0)
他错误地使用了ThreadLocal
,或者错误地使用了ConcurrentHashMap
。组合有意义的可能性接近于0.
答案 2 :(得分:0)
除了@aioobe所说的,考虑InheritableThreadLocal
的情况,其中local的值从一个线程传递给它创建的每个子线程。
正如@pst所说,没有什么可以阻止在不同的(不可继承的)ThreadLocal
中使用相同的值。
简而言之,您必须彻底分析线程本地,初始化它们的方式以及它们的使用方式,然后才能安全地断定它们不需要线程安全。