[英]Why ThreadLocal doesn't create in new thread?
创建类Collector来生成具有值的地图(例如)。 需要收集器包含资源,该资源只能由当前线程访问。
该类收集器如下所示:
public class Collector
{
ThreadLocal<Map<String, String>> storage;
public Map<String, String> collection(int id) {
storage = new ThreadLocal<>();
storage.set(new HashMap<>());
for (int i = id * 100; i <= id * 1000; i+=id * 100)
{
storage.get().put(String.valueOf(i), "test");
}
return storage.get();
}
}
我尝试在不同的线程中同时执行方法collection(int id)
。 我的建议是基于官方文件 。 但是有时会抛出NullPointerException ,我的观察指出了由另一个线程重新创建ThreadLocal,因此NullPointerException抛出了storage.get().put(String.valueOf(i), "test");
,因为在该行的另一个线程中storage = new ThreadLocal<>();
重新初始化。
下面显示的代码在其中运行两个线程:
Collector collector = new Collector();
new Thread(new Runnable()
{
@Override
public void run()
{
System.out.println(collector.collection(1));
}
}).start();
new Thread(new Runnable()
{
@Override
public void run()
{
System.out.println(collector.collection(2));
}
}).start();
如何使用ThreadLocal在每个线程中拥有本地资源,这与另一个线程无关?
问题是您每次重新创建一个新的ThreadLocal
实例时,
collection(int)
方法被称为
this.storage = new ThreadLocal<>();
ThreadLocal<Map<String, String>>
可以是类static
字段
private final static ThreadLocal<Map<String, String>> STORAGE = new ThreadLocal<>();
要设置和获取Thread
的关联值,只需使用
// You're better off passing and using an already constructed instance
STORAGE.set(new HashMap<>());
STORAGE.get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.