Java中ThreadLocal的原理

一、既然要学习它,那我们就先简单的了解一下它(什么是TreadLocal)

     根据相关文档(JDK文档)中的解释:ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性
二、那么如何用它呢?

     Tread Local用于多线程情况下,为每个线程分配一个属于该线程的全局变量,实现线程之间的数据隔离。TreadLocal使用上主要是set和get两个方法。在测试类中,以下代码

ThreadLocal<Integer> threadLocal1 = new ThreadLocal<>();//创建一个ThreadLocal对象
threadLocal1.set(1);
ThreadLocal<Integer> threadLocal2 = new ThreadLocal<>();
threadLocal2.set(2);
Integer number1 = threadLocal1.get();
Integer number2 = threadLocal2.get();

三、怎么实现的呢?

ThreadLocal 大致实现原理是:在某个线程上绑定一个类似Map结构的容器,Map的key是一整个Thread Local变量,而它的value是Thread Local中所存储的Map对象。

ThreadLocal 的set方法源代码如下:

    public void set(T vule){
        //获取当前线程
        Thread t = Thread.currentThread();
        //获取当前线程绑定的类Map
        ThreadLocalMap map = getMap();
        //如果存在,那么将本ThreadLocal变量做为map的key ,ThreadLocal变量所代表的对象,作为value
        if(map != null){
            map.set(this,value);
        }else {
            createMap(t,vule);
        }
    }

 其中的getMap()方法和createMap()方法中的具体代码如下:

ThreadLocalMap getMap(Thread t){
    return t.threadLocals;   //返回一个ThreadLocalMap对象
}


void createMap(Thread t,T firstValue){
    t.threadLocals = new ThreadLocalMap(this,firstValue);
}

threadLocals是现线程的成员变量,类型为ThreadLocal.ThreadLocalMap ,这里我们也可以发现,保存ThreadLocal的容器ThreadLocalMap是一个ThreadLocal的内部类。

最后我本人总结出TreadLocal的以下几个特点:

    1.ThreadLocal中包含的对象,可以在不同的Thread中保持不同的副本,且该副本只能当前Thread使用

    2,解决了多线程之间的共享问题。

     3.使用于每个线程都需自己独立的实例,并且该实例需要在多个方法中使用,也即变量在线程见隔离,而在方法或者类间共享的场景。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值