6

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

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

4

3 回答 3

7

如果对并发 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());
    }
});
于 2011-06-26T06:48:20.480 回答
0

除了@aioobe 所说的之外,考虑 的情况InheritableThreadLocal,其中 local 的值从线程传递到它创建的每个子线程。

正如@pst 所说,没有什么可以阻止在不同的(不可继承的)ThreadLocals 中使用相同的值。

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

于 2011-06-26T08:03:44.387 回答
0

要么他用ThreadLocal错了,要么用ConcurrentHashMap错了。组合有意义的可能性接近于 0。

于 2011-06-26T07:47:39.110 回答