ThreadLocal原理及详解

ThreadLocal原理

首先多线程访问同一个共享变量特别容易出现数据出错,为了保证线程安全,需要做一些同步的措施,同步的措施一般是加锁,有没有一种方式当访问这个变量时,会变成线程内部自己的变量,ThreadLocal就可以做这件事。

其实ThreadLocal可以理解为一个工具,线程真正调用ThreadLocal存数据其实数据是存储在ThreadLocal类中:threadLocals和inheritableThreadLocals中的。这两个变量时一个map类型的,其中key存的是当前调用这个ThreadLocal的线程也就是this,value是要传入的值。默认情况下每个线程中的这两个变量都为Null,也只有当前线程调用ThreadLocal的set或get才会创建它。下面贴出set和get及remove的源码,画一个图方便理解。

在这里插入图片描述

public T get() {
Thread var1 = Thread.currentThread();
ThreadLocal.ThreadLocalMap var2 = this.getMap(var1);
if (var2 != null) {
ThreadLocal.ThreadLocalMap.Entry var3 = var2.getEntry(this);
if (var3 != null) {
Object var4 = var3.value;
return var4;
}
}
//如果ThreadLocalMap为空就重新建一个
return this.setInitialValue();
}

public void set(T var1) {
    Thread var2 = Thread.currentThread();
    ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
    if (var3 != null) {
        var3.set(this, var1);
    } else {
        this.createMap(var2, var1);
    }

}

public void remove() {
    ThreadLocal.ThreadLocalMap var1 = this.getMap(Thread.currentThread());
    if (var1 != null) {
        var1.remove(this);
    }

}

总结

在每个线程内部都有一个threadlocals变量,该变量为HashMap,其中key为调用的线程,value为set设置的值,如果线程一直不消亡,本地变量就一直存在,容易引发内存溢出,所以当我们使用完毕后记得调用ThreadLocal的remove方法删除对应本地变量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值