繁体   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