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



相关文章
|
存储 机器学习/深度学习 缓存
我惊了!!!ThreadLocal 源码存在内存泄露的 Bug!!!
我惊了!!!ThreadLocal 源码存在内存泄露的 Bug!!!
117 0
|
存储 消息中间件 JavaScript
ThreadLocal 你真的用不上吗?
ThreadLocal 你真的用不上吗?
|
存储 缓存 Java
终于弄明白了ThreadLocal
ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用。
147 0
终于弄明白了ThreadLocal
|
Java
如何避免忘记清理 ThreadLocal ?
hreadLocal 可以解决“线程安全问题”。 也可以作为上下文暂存数据以备后续步骤获取。 但是 ThreadLocal 用不好的确容易产生故障,因而有些团队不允许使用 ThreadLocal。 最核心的一个原因是很容易忘记清理,在线程池环境下复用导致串环境。 那么,有什么优雅的解法没?本文给出自己的一个解法。
731 0
如何避免忘记清理 ThreadLocal ?
ThreadLocal不好用?那是你没用对!(2)
ThreadLocal不好用?那是你没用对!(2)
94 0
ThreadLocal不好用?那是你没用对!(2)
|
安全
ThreadLocal不好用?那是你没用对!(5)
ThreadLocal不好用?那是你没用对!(5)
101 0
ThreadLocal不好用?那是你没用对!(5)
ThreadLocal不好用?那是你没用对!(11)
ThreadLocal不好用?那是你没用对!(11)
104 0
ThreadLocal不好用?那是你没用对!(11)
|
存储 对象存储
ThreadLocal不好用?那是你没用对!(13)
ThreadLocal不好用?那是你没用对!(13)
121 0
ThreadLocal不好用?那是你没用对!(13)
ThreadLocal不好用?那是你没用对!(14)
ThreadLocal不好用?那是你没用对!(14)
98 0
ThreadLocal不好用?那是你没用对!(14)
ThreadLocal不好用?那是你没用对!(7)
ThreadLocal不好用?那是你没用对!(7)
84 0
ThreadLocal不好用?那是你没用对!(7)