ThreadLocal相关使用

简介: ThreadLocal相关使用

ThreadLocal相关使用

简介

ThreadLocal类用来提供线程内部的局部变量,这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLoca实例通常来说都是private static类型的,用于关联线程和线程上下文。

三个方面讨论ThreadLocal:

  1. 线程并发:如果是单线程,也就i用不到ThreadLocal来存储独立于其他线程的变量了,只有在多线程并发情况下,ThreadLocal用处得以体现。
  2. 传递数据:我们可以通过ThreadLocal中存储变量在线程中的不同组件之间传递数据。
  3. 线程隔离:指的是不同线程的ThreadLocal是相互隔离,相互不影响的。

ThreadLocal常用方法

  1. ThreadLocal()方法:创建ThreadLocal对象。
  2. set() 设置当前线程绑定的局部变量
  3. get() 获取当前线程绑定的局部变量
  4. remove() 移除当前线程绑定的局部变量

ThreadLocal和synchronized区别

ThreadLocal

ThreadLocal采用的是空间换时间的方式,在每个线程中可以保存一个变量的副本,保证多线程之间不会相互影响,

**侧重:**多个线程并发执行时数据相互隔离。

synchronized

synchronized采用的是时间换空间的方式,只提供一分变量,但是让多个线程顺序执行,从而达到的互不影响。

**侧重:**多个线程之间资源同步。

ThreadLocal的内部设计

JDK1.8以前的设计

ThreadLocal的底层是使用map进行实现的,map的key是当前线程,value就是当前线程中要存储的变量,每个线程其内部ThreadLocalMap用于存储对应的键值对。

JDK1.8及以后的设计

ThreadLocal的底层是使用map进行实现的,和之前的区别就是map的key使用ThreadLocal存储的。而不再是当前线程Thread,且一个线程中可以有多个 ThreadLocal,存储在 ThreadLocalMap中,同样的 ThreadLocalMap也有初始大小和阈值,初始大小为16,阈值为当前大小的三分之二。

(1)每个Threads线程内部都有一个Map(ThreadLocalMap)

(2)Map里面存储ThreadLocal对象(key)和线程的变量副本(value)

(3)Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。

(4)对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离互不干扰。

内存泄漏及解决方法

弱引用相关问题

ThreadLocalMap结构

ThreadLocalMap中的节点继承的是软引用,ThreadLocalMap没有继承Map接口,采用独立的方式实现map的功能。

弱引用会造成内存泄漏吗?

答案:会就算是弱引用,在垃圾回收的时候ThreadLocal被回收,但是Entry中的还有对应的value,同样还是会照成泄露,只能通过remove把value移除或者线程执行借宿移除。

最终解决方案

避免内存泄露的两种方式:

  1. 使用完ThreadLocal,调用remove方法删除对应的entry
  2. 使用完ThreadLocal ,当前线程也随即结束。

ThreadLocalMap存储的时候Map冲突

底层采用的解决方法:线性探测法,当从图的时候查看下一个位置是否满足要求,超过map的长度后从头开始。

相关文章
|
3月前
|
Java 测试技术 索引
ThreadLocal详解
文章详细讨论了Java中的`ThreadLocal`,包括它的基本使用、定义、内部数据结构`ThreadLocalMap`、主要方法(set、get、remove)的源码解析,以及内存泄漏问题和避免策略。`ThreadLocal`提供了线程局部变量,确保多线程环境下各线程变量的独立性,但不当使用可能导致内存泄漏,因此建议在不再需要`ThreadLocal`变量时调用其`remove`方法。
105 2
ThreadLocal详解
|
5月前
|
Java
ThreadLocal 场景题
ThreadLocal 场景题
35 1
|
6月前
|
存储 Java
ThreadLocal 有什么用
ThreadLocal 有什么用
52 0
|
11月前
|
存储
ThreadLocal
ThreadLocal
52 0
|
存储 安全 Java
ThreadLocal介绍和应用
ThreadLocal介绍和应用
65 0
|
缓存 安全 Java
浅谈ThreadLocal
浅谈ThreadLocal
146 0
|
存储 Java
|
存储 Java 数据库连接
对ThreadLocal的一点了解
ThreadLocal是线程变量,它为每个线程提供单独的存储空间。其主要作用是做线程间的数据隔离,也可以用于在同一个线程间方便地进行数据共享。(对于多线程资源共享,加锁机制采用“时间换空间”,ThreadLocal采用“空间换时间”)
127 0
|
存储 安全 Java
ThreadLocal 使用详解
ThreadLocal 是线程本地变量。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程
543 0
|
存储 安全 Java
我把 ThreadLocal 能问的,都写了(上)
我把 ThreadLocal 能问的,都写了(上)
我把 ThreadLocal 能问的,都写了(上)