我最近看到了一段代码,它使用了一个ThreadLocal
对象并在其中保留了一个ConcurrentHashMap
。
这有什么逻辑/好处,还是多余的?
我最近看到了一段代码,它使用了一个ThreadLocal
对象并在其中保留了一个ConcurrentHashMap
。
这有什么逻辑/好处,还是多余的?
如果对并发 hashmap 的唯一引用驻留在 中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());
}
});
除了@aioobe 所说的之外,考虑 的情况InheritableThreadLocal
,其中 local 的值从线程传递到它创建的每个子线程。
正如@pst 所说,没有什么可以阻止在不同的(不可继承的)ThreadLocal
s 中使用相同的值。
简而言之,您必须彻底分析线程局部变量、它们的初始化方式以及它们的使用方式,然后才能安全地得出结论,它们不需要是线程安全的。
要么他用ThreadLocal
错了,要么用ConcurrentHashMap
错了。组合有意义的可能性接近于 0。