首页 > 其他分享 >ThreadLocal

ThreadLocal

时间:2023-08-28 22:25:20浏览次数:26  
标签:副本 变量 Thread ThreadLocal threadLocals 线程

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。

  • 因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。
  • 既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题

Threadlocl是作为当前线程中属性ThreadLocalMap集合中的某一个Entry的key值Entry(threadlocl,value),虽然不同的线程之间threadlocal这个key值是一样,但是不同的线程所拥有的ThreadLocalMap是独一无二的,也就是不同的线程间同一个ThreadLocal(key)对应存储的值(value)不一样,从而到达了线程间变量隔离的目的,但是在同一个线程中这个value变量地址是一样的。

  Thread类中有一个变量 threadLocals ,它是ThreadLocal内部类ThreadLocalMap类型的变量

只有当线程第一次调用ThreadLocal的set或者get方法的时候,才会创建他们。另外,其实每个线程的本地变量不是存放在ThreadLocal实例中的,而是存储在了对应线程的 threadLocals 变量里面(前面也说过,该变量是Thread类的变量)。也就是说,ThreadLocal类型的线程本地变量是存放在具体的线程空间上的,ThreadLocal本身相当于一个装载本地变量的工具壳,通过set方法将value添加到调用线程的threadLocals中,当调用线程调用get方法时候能够从它的threadLocals中取出变量。如果调用线程一直不终止,那么这个本地变量将会一直存放在他的threadLocals中, 就可能会导致内存溢出,因此使用完后需要将其remove掉,调用remove方法,将threadLocals中的本地变量删除。 
 


 


 

标签:副本,变量,Thread,ThreadLocal,threadLocals,线程
From: https://www.cnblogs.com/KL2016/p/17663515.html

相关文章

  • 20230615 java.lang.ThreadLocal
    介绍java.lang.ThreadLocalpublicclassThreadLocal线程局部变量APIstatic方法withInitial<S>ThreadLocal<S>withInitial(Supplier<?extendsS>supplier)创建一个线程局部变量,其初始值通过调用给定的supplier生成public方法get得到这个线程的当前值......
  • mybatis-plus公共字段自动填充与ThreadLocal
    1、为什么使用mybatisplus自动填充在项目开发中,我们会发现有一些数据库表字段是每个表都有的,在之前针对这些字段我们的目前的处理方式就是增加或者修改的时候一个一个的去赋值,如果都按这样的方法进行操作的话,那我们就需要在每个业务方法中进行操作,这样会显得我们的代码过于冗余......
  • ThreadLocal
    ThreadLocal的作用ThreadLocal主要就是让每个线程绑定自己的值,就相当于是一个储存数据的盒子,盒子中可以储存每个线程的私有数据,当创建了ThreadLocal变量那么访问这个变量的每个线程都会有这个变量的本地副本他们可以使用get() 和set()方法来获取默认值或将其值更改为当前线程......
  • 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......