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。。。