将ThreadSafe对象放在ThreadLocal上有什么好处吗



我最近看到一段代码,它使用了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中使用相同的值。

简而言之,您必须对线程局部变量、它们的初始化方式和使用方式进行彻底的分析,然后才能安全地得出结论,认为它们不需要是线程安全的。

最新更新