首页 > 其他分享 >ThreadLocal

ThreadLocal

时间:2023-06-19 18:44:41浏览次数:55  
标签:Map 变量 Thread ThreadLocal 线程 多线程

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

作用
提供线程内的局部变量,不同的线程之间不会相互干扰实现线程的隔离,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。

常用方法

ThreadLocal类与synchronized关键字
ThreadLocal和synchronized都可以实现多线程之间的隔离问题,但是synchronized关键字对多线程并发并不及ThreadLocal。
synchronized原理是采用同步机制,使用“以时间换空间”的方式。只提供一份变量让不同的线程排队访问。侧重于多线程之间的资源访问。
ThreadLocal原理是采用“以空间换时间”的实现方式,为每一个线程都提供一份变量的副本,从而实现同时访问而不互相干扰。侧重于多个线程之间的数据互相隔离。

使用ThreadLocal方案解决并发问题的好处

  1. 传递数据 : 保存每个线程绑定的数据,在需要的地方可以直接获取, 避免参数直接传递带来的代码耦合问题
  2. 线程隔离 : 各线程之间的数据相互隔离却又具备并发性,避免同步方式带来的性能损失

ThreadLocal的内部结构

在JDK8中 ThreadLocal的设计是:每个Thread维护一个ThreadLocalMap,这个Map的key是ThreadLocal实例本身,value才是真正要存储的值Object。
具体的过程是这样的:
(1) 每个Thread线程内部都有一个Map (ThreadLocalMap)
(2) Map里面存储ThreadLocal对象(key)和线程的变量副本(value)
(3)Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。
(4)对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。

这样设计的好处:
(1) 这样设计之后每个Map存储的Entry数量就会变少。因为之前的存储数量由Thread的数量决定,现在是由ThreadLocal的数量决定。在实际运用当中,往往ThreadLocal的数量要少于Thread的数量。
(2) 当Thread销毁之后,对应的ThreadLocalMap也会随之销毁,能减少内存的使用。

在项目中使用ThreadLocal的步骤

  1. 创建ThreadLocal的工具类。
  2. 在类中创建ThreadLocal静态对象。
    private final static ThreadLocal<需要添加的对象类型> THREAD_LOCAL = new ThreadLocal<>();
  3. 在工具类中创建三个方法,分别实现ThreadLocal的三个核心方法。

标签:Map,变量,Thread,ThreadLocal,线程,多线程
From: https://www.cnblogs.com/wzh-Official/p/17491827.html

相关文章

  • Java并发工具之ThreadLocal
    一、ThreadLocal简介1.ThreadLocal是什么?ThreadLocal字面意思是本地线程,其实更准确来说是线程局部变量,线程类Thread有个变量叫做threadLocals,其类型就是ThreadLocal.ThreadLocalMap类型,他其实不是一个Map类型,但可以暂时理解它是一个Map,键为ThreadLocal对象,值就是要......
  • ThreadLocal 与 synchronized 区别
    老实说,从看到这个帖子的题目开始,就觉得帖子的作者估计是在概念上有所混淆了,于是乎想写个咚咚,同大家分享一下自己的心得。帖子上,讨论的人很多,高手不乏,各抒己见,但不知新手们看明白没有,因此,这里偶以最简洁列表方式来说一说相关问题。1.区别ThreadLocal与synchronizedThread......
  • 图解ThreadLocal
    ThreadLocalTestpublicclassThreadLocalTest{publicstaticvoidmain(String[]args){ThreadLocalthreadLoal_1=newThreadLocal();newThread(()->{threadLoal_1.set("hellot1");System.out.print......
  • 深入学习ThreadLocal
    1、用来干吗的?用于线程在任意的地方去共享数据,而不被其他线程所干扰,2、原理是什么因为每个线程维护一份ThreadLocalMap,使用threadlocal.set(obj)方法是存放在map里面的Entry<<WeekReference>ThreadLocal,Value>数组里3、实际案例,比如写了util类,但是SimplateDateFormate是线程......
  • java子线程中获取父线程的threadLocal中的值
    1packagecom.example.springbootstudy.test.threadLocal;23publicclassBaseTest{45publicstaticfinalInheritableThreadLocal<String>inheritableThreadLocal=newInheritableThreadLocal<>();67publicstaticfinalThrea......
  • ThreadLocal 详解【并发容器】
    ThreadLocal是什么?有哪些使用场景?ThreadLocal是一个本地线程副本变量工具类,在每个线程中都创建了一个ThreadLocalMap对象,简单说ThreadLocal就是一种以空间换时间的做法,每个线程可以访问自己内部ThreadLocalMap对象内的value。通过这种方式,避免资源在多线程间共享。原理:......
  • ThreadLocal在拦截器中的使用
    前置过滤捕获,写入context中,后置删除每个request请求都有自己线程独享的数据,所以用到了ThreadLocal1.添加拦截器@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){......
  • 理解Java中的ThreadLocal
    提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和认识,希望让大家理解ThreadLocal更加透彻一些。ThreadLocal是什么 ThreadLocal是一个关于创建线程局部变量的类。通......
  • ThreadLocal是否存在内存泄漏问题,如何防止内存泄漏
    ThreadLocal还是不能百分百地让程序员避免内存泄露,如果程序员不谨慎就很可能导致内存泄露?那么今天我们就来聊聊什么样的情况ThreadLocal不会出现内存泄露?什么样的情况会出现内存泄露?我们如何防止内存泄露的情况发生呢?我们这节就会为同学们一一详细解答,那我们先来简单回忆一下Thr......
  • ThreadLocal源码学习笔记
    系列文章目录和关于我一丶ThreadLocal结构#每一个Thread对象都有一个名为threadLocals类型为ThreadLocal.ThreadLocalMap的属性,ThreadLocal.ThreadLocalMap对象内部存在一个Entry数组,其中存储的Entry对象key是ThreadLocal,value便是我们绑定在线程上的值。ThreadLocal可以做......