【问题标题】:Is there any benefit in puting a ThreadSafe object on a ThreadLocal?将线程安全对象放在 ThreadLocal 上是否有任何好处?
【发布时间】:2011-09-22 21:03:02
【问题描述】:

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

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

【问题讨论】:

  • @Downvoter - 需要解释一下吗?
  • 这里有些人只是投反对票...没有任何评论...我不允许不加评论的投反对票...

标签: java concurrency thread-local


【解决方案1】:

如果only 对并发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());
    }
});

【讨论】:

  • 确实如此。 ThreadLocal 允许 N 个线程有 N 个独立变量——它可能与包含的对象完全无关(不要求每个 ThreadLocal 具有不同和/或唯一的对象)。
【解决方案2】:

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

【讨论】:

  • 这是不正确的。有一些合理的用例,其中线程本地中的对象由多个线程共享。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多