Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ThreadLocal上放置ThreadSafe对象有什么好处吗?_Java_Concurrency_Thread Local - Fatal编程技术网

Java 在ThreadLocal上放置ThreadSafe对象有什么好处吗?

Java 在ThreadLocal上放置ThreadSafe对象有什么好处吗?,java,concurrency,thread-local,Java,Concurrency,Thread Local,我最近看到一段代码,它使用了ThreadLocal对象,并在其中保留了ConcurrentHashMap 这有什么逻辑/好处,还是多余的?如果并发hashmap的唯一引用位于ThreadLocal中,则hashmap显然只从单个线程引用。在这种情况下,我会说这是完全多余的 但是,不难想象有人与其他线程“共享”本地存储的线程hashmap: ThreadLocal<ConcurrentHashMap<String, String>> tl = ... // ... fi

我最近看到一段代码,它使用了
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());
    }
});
ThreadLocal tl=。。。
// ...
最终ConcurrentHashMap props=tl.get();
invokeLater(新的Runnable(){
公开募捐{
add(key.getText(),val.getText());
}
});

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

< P>除了“AIOOBE”所说的,考虑“代码>继承ItababLead RealPosie<代码>的情况,其中本地值从线程传递到它创建的每个子线程。

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


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

的确如此
ThreadLocal
允许N个线程具有N个独立变量——它可能与包含的对象完全不相关(不要求每个ThreadLocal具有不同和/或唯一的对象)。这是不正确的。在一些合理的用例中,线程本地中的对象被多个线程共享。@Downvoter-需要解释吗?这里有一些人只是不加评论地进行了downvote…我不允许不加评论地进行downvote。。。