ThreadLocal 源码分析
博客专区 > ovirtKg 的博客 > 博客详情
ThreadLocal 源码分析
ovirtKg 发表于1年前
ThreadLocal 源码分析
  • 发表于 1年前
  • 阅读 12
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

ThreadLocal  每个线程中保存了一个变量的副本,一般的用法是,定义一个共享的变量或者一个静态的成员,每个不同的线程中可以对其进行取值,与设置,每个线程互不干扰,一个线程中有一个独立的值。

最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等。也可以用于在 资源的频繁释放与获取时消耗大量的cpu时,可通过ThreadLocal解决该问题。

如每个任务在运行前需要一个context,运行后该context需要释放。如果线程是固定的,只是线程是用来执行任务的。所以在这种情况下,可以定义一个静态的变量ThreadLocal,

从源码分析其是如何实现的

get()

    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);  // 获取t中的一个保存线程变量的map容器
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();   //初始化 map,并根据 定义时,重写的方法定义初始值
    }

 首先得到线程的 变量内部类对象  threadLocalMap,从该值中 以threadLocal作为key,当前线程的变量为value,

set(T t)

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

也就是说,每个Thread 线程对象中,有一个map容器变量  保存了当前线程中的所有ThreadLocal的值。

共有 人打赏支持
粉丝 4
博文 56
码字总数 48798
×
ovirtKg
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: