java ThreadLocal 不解,请教大神

我是橙子岳 发布于 2017/07/13 15:23
阅读 181
收藏 0

  public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }

    /**
     * Variant of set() to establish initialValue. Used instead
     * of set() in case user has overridden the set() method.
     *
     * @return the initial value
     */
    private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) // map一定不是null啊,为什么还要判断这一步
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

 

 

通过get()方法,如果map为null,会执行setInitialValue()方法,但是为什么在此方法中,又重复判断了,map是否为null?这个时候map一定为null 啊

加载中
1
DeMoNHaDeS
DeMoNHaDeS

只看这两个方法的情况下,个人理解:

1、map一定只有当前线程能够操作吗,不一定。其他线程也有可能通过一些手段获取到这个map来修改。不过这么讲确实比较牵强。

2、从方法的角度讲,我认为好的代码,方法的内容要对方法名和方法注释负责。在ThreadLocal这个类中,setInitialValue()确实只有get()调用了它。但是setInitialValue()作为一个独立的方法,应该保证自己的逻辑完整。也就是说setInitialValue()不只是对get()负责,以后如果有其他方法要调用它,也要对其他方法负责。

Soutv
Soutv
非常标准的回答
返回顶部
顶部