首页 > 其他分享 >ThreadLocal 详解

ThreadLocal 详解

时间:2023-05-02 20:55:26浏览次数:51  
标签:变量 Thread ThreadLocalMap ThreadLocal 详解 线程 key

1.ThreadLocal是什么? / 为什么要使用ThreadLocal?

ThreadLocal是什么?

  ThreadLocalThreadLocal类位于java.lang包下,由JDK包提供。如果创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,多个线程操作这个变量的时候,其实是在操作自己本地内存里的变量,他们可以使用 get()set() 方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题

为什么要使用ThreadLocal?

  并发场景下,会存在多个线程同时修改一个共享变量的场景,这就可能会出现线程安全问题。为了解决线程安全问题,可以用加锁的方式,比如synchronized或者lock,但是加锁可能会导致系统变慢

 

2.ThreadLocal原理:

  最终的变量是放在了当前线程的 ThreadLocalMap 中,并不是存在 ThreadLocal 上,ThreadLocal 可以理解为只是ThreadLocalMap的封装,传递了变量值。 ThrealLocal 类中可以通过Thread.currentThread()获取到当前线程对象后,直接通过getMap(Thread t)可以访问到该线程的ThreadLocalMap对象。

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

  比如我们在同一个线程中声明了两个 ThreadLocal 对象的话, Thread内部都是使用仅有的那个ThreadLocalMap 存放数据的,ThreadLocalMap的 key 就是 ThreadLocal对象,value 就是 ThreadLocal 对象调用set方法设置的值。

 

 1.ThreadLocal的数据结构:

  Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals,也就是说每个线程有一个自己的ThreadLocalMap

  ThreadLocalMap有自己的独立实现,可以简单地将它的keyThreadLocal的一个弱引用value为代码中放入的值。

  每个线程在往ThreadLocal里放值的时候,都会往自己的ThreadLocalMap里存,读也是以ThreadLocal作为引用,在自己的map里找对应的key,从而实现了线程隔离

 

2.GC 之后 key 是否为 null?

 

 

 

 

 

 

 

 

 

 

 

标签:变量,Thread,ThreadLocalMap,ThreadLocal,详解,线程,key
From: https://www.cnblogs.com/cjhtxdy/p/17368075.html

相关文章

  • 第11讲 AXI_FULL自定义总线详解
    DDR3 IP基础知识  (1条消息)快速上手XilinxDDR3IP核----汇总篇(MIG)_ddr3xilinx_孤独的单刀的博客-CSDN博客DDR3_MIG_TB   moduletop(  output    [31:0]   c);localparam[15:0]  a=65535;localparam[15:0]  b=25687;assignc=a*......
  • Java 网络编程 —— ServerSocket 详解
    构造ServerSocketServerSocket的构造方法有以下几种重载形式ServerSocket()throwsIOExceptionServerSocket(intport)throwsIOExceptionServerSocket(intport,intbacklog)throwsIOExceptionServerSocket(intport,intbacklog,InetAddressbindAddr)throwsIOE......
  • TCP三次握手和四次挥手详解
    在三次握手发送的数据包中有两个ACK值(Acknowledgement),人们习惯一个大写,一个小写来加以区分。其实ACK也好,ack也好,只不过是个代号而已,叫他张三也行,叫他李四也没事,没有任何影响,因为咱们不会改动那个东西。就算是把名字记反了,对咱们也没有任何影响,大家知道三次握手的数据包里有这么......
  • 第5讲 FPGA运算符详解
    1moduletop(2output[31:0]c3);45localparam[15:0]a=65535;6localparam[15:0]b=25687;789assignc=a*b;10//两个常数相乘,综合后不使用资源,直接综合为一个常数11moduletop(12output[15:0]c1......
  • Go 汇编详解
    Go汇编详解https://mp.weixin.qq.com/s?__biz=MzI1MzYzMjE0MQ==&mid=2247502457&idx=1&sn=9b754e6b17ade0d48694d089b6537092&chksm=e9d3019bdea4888df6dbde663632d06d7a695b563669ba4a94b1eca78d8ecb2c041af9023959&scene=132#wechat_redirect翻译搜索复制......
  • 详解 HTTPS 概念
    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。HTTPS简介HTTPS其实是有两部分组成:HTTPSSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加......
  • 详解 HTTPS 概念
    导读我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。HTTPS简介HTTPS其实是有两部分组成:HTTPSSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS......
  • 闭包详解(转)
    闭包:是指有权访问另外一个函数作用域中的变量的函数。创建闭包的常见方式就是在一个函数内部创建另外一个函数。 在javascript中没有块级作用域,一般为了给某个函数申明一些只有该函数才能使用的局部变量时,我们就会用到闭包,这样我们可以很大程度上减少全局作用域中的变量,净化全局作......
  • PreferenceActivity详解
    为了引入这个概率首先从需求说起即:现有某Activity专门用于手机属性设置那么应该如何做呢?根据已学知识很快一个念头闪过即:Activity+Preference组合前者用于界面构建后者用于设置数据存放 其实这是正确的但是这会比较繁琐因为每个设置选项......
  • Android中Context详解 ---- 你所不…
    大家好,             Interfacetoglobalinformationaboutanapplicationenvironment.ThisisanabstractclasswhoseimplementationisprovidedbytheAndroidsystem.Itallowsaccesstoapplication-specificresourcesandclasses,aswellasup-c......