将Thread Safe对象放在ThreadLocal上有什么好处吗?

时间:2011-06-26 06:43:47

标签: java concurrency thread-local

我最近看到一段代码使用了ThreadLocal对象并在其中保留了ConcurrentHashMap

这有什么逻辑/好处,还是多余的?

3 个答案:

答案 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中使用相同的值。

简而言之,您必须彻底分析线程本地,初始化它们的方式以及它们的使用方式,然后才能安全地断定它们不需要线程安全。