问答详情
源自:4-1 实现自己的ThreadLocal

为什么threadLocalMap要设计为Static的双层map,如果设计为非静态的单层map有什么问题?

如下:

public class MyThreadLocal<T> {
    /**
     * key: threadId; value:存储内容
     */
    private Map<Long, T> threadMap = new HashMap<>();
    public void set(T data){
        long threadId = Thread.currentThread().getId();
        threadMap.put(threadId, data);
    }
    public T get(){
        long threadId = Thread.currentThread().getId();
        if (!threadMap.containsKey(threadId)) {
            threadMap.put(threadId, initialValue());
        }
        return threadMap.get(threadId);
    }
    protected T initialValue(){
        return null;
    }
}

我感觉这样已经完全能实现线程隔离的功能。

老师那种写法,是因为JDK设计threadLocalMap属于Thread的成员变量,所以才需要双重Map嵌套。

我的理解正确吗?如果正确的话,为什么JDK要这样设计,而不用我的这种写法?


提问者:诺尔雷顿 2020-05-07 13:18

个回答

  • 实时编程
    2020-12-09 17:33:42

    HashMap。本身就不是线程安全的,所以 你这个写法 我暂时不确定 是不是能正确的运行 

    但是既然不是线程安全的  所以 我觉得 不可以这样写

    如果你加个锁 确实可以 变成安全的 操作

    但是就会 变成多线程 竞争锁   非常消耗性能

    虽然实现了 类似功能 但是性能 太低 

    所以JDK 不会这样设计

  • 腾飞的心0
    2020-06-14 12:03:04

    如果不是static,你怎么知道你存到哪里(哪个实例的变量里)了呢