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的长度后从头开始。

相关文章
|
存储 安全 Java
【ThreadLocal】
【ThreadLocal】
|
6月前
|
Java
ThreadLocal 场景题
ThreadLocal 场景题
41 1
|
存储
ThreadLocal
ThreadLocal
58 0
|
存储 安全 Java
ThreadLocal介绍和应用
ThreadLocal介绍和应用
72 0
|
缓存 安全 Java
浅谈ThreadLocal
浅谈ThreadLocal
156 0
|
存储 Java
对threadlocal了解多少?
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK 中提供的 ThreadLocal 类正是为了解决这样的问题。 ThreadLocal 类主要解决的就是让每个线程绑定自己的值,可以将 ThreadLocal 类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。
|
存储 算法 安全
深入理解 ThreadLocal
深入理解 ThreadLocal
深入理解 ThreadLocal
|
存储 缓存 算法
再聊聊ThreadLocal
只要线程处于活动状态并且 ThreadLocal 实例可访问,那么每个线程都持有对其线程局部变量(thread-local)副本的隐式引用。在线程消失后,它的所有线程局部变量(thread-local)副本都将被垃圾回收(除非存在对这些副本的其他引用)
再聊聊ThreadLocal