[英]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.