为了账号安全,请及时绑定邮箱和手机立即绑定

为什么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要这样设计,而不用我的这种写法?


正在回答

2 回答

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

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

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

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

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

所以JDK 不会这样设计

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信