簡體   English   中英

為什么ThreadLocal不在新線程中創建?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM