首页 > 其他分享 >ThreadLocal

ThreadLocal

时间:2023-08-18 21:55:12浏览次数:35  
标签:变量 Thread ThreadLocalMap ThreadLocal 线程 key

ThreadLocal的作用

ThreadLocal主要就是让每个线程绑定自己的值,就相当于是一个储存数据的盒子,盒子中可以储存每个线程的私有数据,当创建了ThreadLocal变量那么访问这个变量的每个线程都会有这个变量的本地副本他们可以使用 get() 和 set()方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。

ThreadLocal的使用

Thread类中有一个threadLocals 和 一个inheritableThreadLocals 变量,它们都是ThreadLocalMap类型的变量,我们可以把ThreadLocalMap理解为ThreadLocal类实现的定制化的HashMap。默认情况下这两个变量都是 null,只有当前线程调用 ThreadLocal 类的set或get方法时才创建它们,实际上调用这两个方法的时候,我们调用的是ThreadLocalMap类对应的 get()、set() 方法。所以他的变量最终是放在了当前线程的ThreadLocalMap中,并不是存在ThreadLocal 上,ThreadLocal 可以理解为只是ThreadLocalMap的封装,传递了变量值ThreadLocal 类中可以通过Thread.currentThread()获取到当前线程对象后,直接通过getMap(Thread t)可以访问到该线程的ThreadLocalMap对象。

每个Thread 中都具备一个ThreadLocalMap,而ThreadLocalMap可以存储以ThreadLocal 为 key ,Object 对象为 value 的键值对。

 ThreadLocal 内存泄露问题是怎么导致的?

ThreadLocalMap中使用的 key 为 ThreadLocal  的弱引用,而 value 是强引用。所以,如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候,key 会被清理掉,而 value 不会被清理掉。

这样一来,ThreadLocalMap中就会出现 key 为 null 的 Entry。假如我们不做任何措施的话,value 永远无法被 GC 回收,这个时候就可能会产生内存泄露。ThreadLocalMap 实现中已经考虑了这种情况,在调用get()、set() 、remove() 方法的时候,会清理掉 key 为 null 的记录。使用完 ThreadLocal 方法后最好手动调用remove()方法

 

 

 

标签:变量,Thread,ThreadLocalMap,ThreadLocal,线程,key
From: https://www.cnblogs.com/zcj-gh/p/17641697.html

相关文章

  • ThreadLocal 详解
    ThreadLocal中ThreadLocalMap的数据结构?Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals,也就是说每个线程有一个自己的ThreadLocalMap。ThreadLocalMap有自己的独立实现,可以简单地将它的key视作ThreadLocal,value为代码中放入的值(实际上key并不是ThreadLo......
  • Threadlocal
    一:Threadlocal的key是弱引用,那么在Threadlocal.get()的时候,发生GC之后,key否为nul!?答:在ThreadLocal中,key是使用弱引用的。在执行ThreadLocal.get()方法时,如果发生了垃圾回收(GC),对应的key会自动被回收,并在下一次ThreadLocal操作时被剔除 二:ThreadLocal中ThreadLocalMap的数据......
  • ThreadLocal的作用以及其存在的问题
    ThreadLocal是JDK自带的一个类,他的作用是为每个线程中创建专属本地变量,这些变量只能被当前线程访问和修改,其他线程无法访问,当你创建了一个ThreadLocal里的变量后,每个访问这个变量的线程都会获得一个此变量的本地副本,同时THreadLocal提供了get()、set()方法来获取默认值,或将其值更......
  • 数据库连接池为什么要用threadlocal呢?不用会怎样?
    数据库连接池使用ThreadLocal的主要原因是为了保证每个线程都有其独立的数据库连接,这样可以避免多个线程之间的连接干扰,提高系统的稳定性和性能。为什么使用ThreadLocal?线程安全:ThreadLocal可以为每个线程提供一个独立的数据库连接,确保多个线程操作数据库时不会出现资源竞争的......
  • ThreadLocal的学习心得
    ThreadLocal是Java提供的线程本地存储机制,可以实现多线程环境下数据的隔离。主要特点是:每个线程都有自己的实例副本,实现了线程的数据隔离。ThreadLocal中存储的值对其他线程都不可见。通过get()和set()来读写当前线程的实例副本,避免了线程安全问题。本地线程副本通过弱......
  • 自定义实现可跨线程(线程池)的ThreadLocal
    packageTest0814;importcom.google.common.collect.Maps;importjava.util.HashMap;importjava.util.Map;importjava.util.WeakHashMap;publicclassMyThreadLocal<T>extendsInheritableThreadLocal<T>{//方法1publicstaticfinalInherita......
  • 使用 transmittable-thread-local 组件解决 ThreadLocal 父子线程数据传递问题
    在某个项目中,需要使用mybatis-plus多租户功能以便数据隔离,前端将租户id传到后端,后端通过拦截器将该租户id设置到ThreadLocal以便后续使用,代码大体上如下所示:ThreadLocal<Integer>threadLocal=newInheritableThreadLocal<>();threadLocal.set(1);Java 我在Controlle......
  • 谈谈对TransmittableThreadLocal的理解
    前言最近遇到一个问题,公司内部有一个公共的SSO包,用来获取HTTP请求中的登录态,代码中会直接用这个包的方法获取用户登录信息,在代码任意位置直接用SSOUtil.getUser()获取用户信息,在我们一个下载的业务代码中,用到了线程池开启子任务处理请求,结果发现子任务中拿到的用户信息和HTTP请......
  • 线程池使用InheritableThreadLocal踩坑总结
    一、缘起某天测试环境更新后,有小伙伴反应页面会随机性的发生请求参数为空的情况(request.getParamter为空),但是前端的参数是传了的,而且不能稳定重现,需要在页面上经过一番操作之后才会发生,而当问题重现之后,之前那些可用的页面就变得不可用了,然后就会在可用和不可用之间交替........
  • 异步线程变量传递必知必会---InheritableThreadLocal及底层原理分析
    InheritableThreadLocal简介笑傲菌:多线程热知识(一):ThreadLocal简介及底层原理3赞同·0评论文章上一篇文章我们聊到了ThreadLocal的作用机理,但是在文章的末尾,我提到了一个问题,ThreadLocal无法实现异步线程变量的传递。什么意思呢?以下面的代码为例子:@SneakyThrowspublicBo......