ThreadLocal不好用?那是你没用对!(10)

简介: ThreadLocal不好用?那是你没用对!(10)

接下来来看 Threadlocal.get 源码的实现:


public T get() {
    // 得到当前的线程
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    // 判断 ThreadLocal 中是否有数据
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            // 有 set 值,直接返回数据
            return result;
        }
    }
    // 执行初始化方法【重点关注】
    return setInitialValue();
}
private T setInitialValue() {
    // 执行初始化方法【重点关注】
    T value = initialValue();
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
    return value;
}


从上述源码可以看出,当 ThreadLocal 中有值时会直接返回值 e.value,只有 Threadlocal 中没有任何值时才会执行初始化方法 initialValue


注意事项—类型必须保持一致


注意在使用 initialValue 时,返回值的类型要和 ThreadLoca 定义的数据类型保持一致,如下图所示:


微信图片_20220120185338.jpg


如果数据不一致就会造成 ClassCaseException 类型转换异常,如下图所示:


微信图片_20220120185359.jpg



相关文章
|
存储 消息中间件 JavaScript
ThreadLocal 你真的用不上吗?
ThreadLocal 你真的用不上吗?
|
存储 缓存 Java
终于弄明白了ThreadLocal
ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用。
174 0
终于弄明白了ThreadLocal
|
Java 数据库
ThreadLocal的使用和坑点
ThreadLocal的使用和坑点
214 0
|
设计模式 算法 Java
|
Java API
ThreadLocal不好用?那是你没用对!(6)
ThreadLocal不好用?那是你没用对!(6)
165 0
ThreadLocal不好用?那是你没用对!(6)
ThreadLocal不好用?那是你没用对!(11)
ThreadLocal不好用?那是你没用对!(11)
119 0
ThreadLocal不好用?那是你没用对!(11)
ThreadLocal不好用?那是你没用对!(12)
ThreadLocal不好用?那是你没用对!(12)
149 0
ThreadLocal不好用?那是你没用对!(12)
|
安全
ThreadLocal不好用?那是你没用对!(4)
ThreadLocal不好用?那是你没用对!(4)
123 0
ThreadLocal不好用?那是你没用对!(4)
ThreadLocal不好用?那是你没用对!(14)
ThreadLocal不好用?那是你没用对!(14)
110 0
ThreadLocal不好用?那是你没用对!(14)
|
安全
ThreadLocal不好用?那是你没用对!(5)
ThreadLocal不好用?那是你没用对!(5)
112 0
ThreadLocal不好用?那是你没用对!(5)