返回顶部
首页 > 资讯 > 后端开发 > JAVA >【ThreadLocal详解】
  • 520
分享到

【ThreadLocal详解】

javajvm面试 2023-08-19 09:08:40 520人浏览 八月长安
摘要

ThreadLocal   ThreadLocal是一个用于实现线程数据隔离的一个类,每个线程访问时,通过Get、Set方法都会产生一个属于该线程的局部变量副本,当线程结束时,ThreadLocal及变量随着线程一起被回收。 Threa


ThreadLocal

  ThreadLocal是一个用于实现线程数据隔离的一个类,每个线程访问时,通过Get、Set方法都会产生一个属于该线程的局部变量副本,当线程结束时,ThreadLocal及变量随着线程一起被回收。


ThreadLocal的作用

总的来说,ThreadLocal有三大用途:

  1. 保存线程上下文信息,在任何地方都可以获取(通过static关键字)     我们可以使用static关键字,在任意地方都可以对该ThreadLocal进行获取、设置。     例如spring中的事务,用ThreadLocal存储了连接对象,保证一次事务的所有操作都在同一连接上。       2. 线程安全,避免某些情况下需要保持同步而带来的性能损失    3. 线程之间数据隔离

ThreadLocal的原理

  ThreadLocal虽然叫线程局部变量,但是它不存储任何数据,它只是一个壳子,真正的存储结构是在ThreadLocal中有一个ThreadLocalMap的一个内部类,而这个内部类却被Thread定义为了成员变量。
而ThreadLocal本身并不存储值,它只是作为key存储在Thread对象中的ThreadLocalMap中,而value则是我们存储的变量。
那么,既然真正存储数据的是Thread对象中的ThreadLocalMap,每个线程都是自己的Thread对象,那么也就达成了线程私有变量以及数据隔离。

public void set(T value) {    // 返回当前 ThreadLocal 所在的线程    Thread t = Thread.currentThread();    // 返回当前线程持有的map    ThreadLocalMap map = getMap(t);    if (map != null) {        // 如果 ThreadLocalMap 不为空,则直接存储键值对        map.set(this, value);    } else {        // 否则,需要为当前线程初始化 ThreadLocalMap,并存储键值对         createMap(t, value);    }}

  源码解析

  1. Set() 方法

在这里插入图片描述

主要有几个步骤:

  1. 获取当前线程
  2. 将当前线程传入getMap()方法,获取ThreadLocalMap对象
  3. 设置 key 为 [当前ThreadLocal对象],value为我们设定的值。
  4. 如果Map不存在,则创建一个Map

  这时候,我们肯定纠结,这个Map到底是什么?我们接着看:

    进入getMap() 方法:

在这里插入图片描述

    这是我们可以看到,该方法返回了当前线程的 threadLocals 属性,那我们再看看是什么:

在这里插入图片描述

    原来是在Thread对象中,看到这里是不是有种明悟,原来:

  1. set() 方法中,首先获取当前线程。
  2. 获取该线程对象中的 threadLocals 属性。
ThreadLocalMap map = getMap(t))
  1. 如果该属性存在,则往其中添加元素。
map.set(this, value)
  1. 而不存在的话,则初始化该属性 threadLocals,并将值添加进去作为初始值
createMap(t, value);void createMap(Thread t, T firstValue) {    t.threadLocals = new ThreadLocalMap(this, firstValue);}

    我们都知道,每个线程在Java内部都表现为一个Thread对象,而每个Thread对象都拥有 threadLocals 属性,在线程调用了 set() 方法后,会初始化该属性,并且将本线程所属的元素存入进去,这样就造成了数据隔离,每个线程有自己的数据。


    实战验证

  • 没有使用ThreadLocal的情况:

在这里插入图片描述

    我们都知道,SimpleDateFORMat因为内部使用了日历对象Calendar,导致不能将其作为线程共享对象,会引发线程安全问题。
因为只有一个Calendar实例,而多线程共享该实例

在这里插入图片描述

    结果(线程1及线程2运行时设置的时间被线程3覆盖,导致出现了错误的结果):

在这里插入图片描述


  • 使用ThreadLocal:

在这里插入图片描述

    结果(因为每个线程都存着自己的那份SimpleDateFormat对象,所以不会出现并发情况):

在这里插入图片描述


    Debug

     线程1拥有的:
在这里插入图片描述

     线程2拥有的:
在这里插入图片描述

     线程3拥有的:
在这里插入图片描述

    可以看到,每个线程都拥有自己的SimpleDateFormat对象。

ThreadLocal内存泄漏

  ThreadLocal内存泄漏指的是:ThreadLocal对象被回收了,但是线程内的ThreadLocalMap成员与线程一样继续存在着,它不会回收,就出现了一个现象,就是ThreadLocalMap的key没了,Map没有了指向,但value还在,key的引用一直在就造成了内存泄漏。

  而为什么ThreadLocal对象会被回收呢,因为它是弱引用。它的生命周期更短,会在一次GC后回收掉。

在这里插入图片描述

  所以使用其最好的方式是:用完了,将其remove掉,从Thread.threadLocals(Map)中删除即可。

总结

  总的来说,ThreadLocal通过避免并发保证数据安全,将数据绑定到Thread对象上,保证了数据隔离。而在使用完毕后,必须手动将值进行remove(),否则,当线程一直运行时,容易出现内存泄漏风险。

来源地址:https://blog.csdn.net/qq_44316957/article/details/127301227

--结束END--

本文标题: 【ThreadLocal详解】

本文链接: https://lsjlt.com/news/375263.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【ThreadLocal详解】
    ThreadLocal   ThreadLocal是一个用于实现线程数据隔离的一个类,每个线程访问时,通过Get、Set方法都会产生一个属于该线程的局部变量副本,当线程结束时,ThreadLocal及变量随着线程一起被回收。 Threa...
    99+
    2023-08-19
    java jvm 面试
  • 详解Java中的ThreadLocal
    目录一、ThreadLocal简介二、ThreadLocal简单使用三、ThreadLocal的实现原理1、set方法源码2、get方法源码3、remove方法的实现四、Thread...
    99+
    2024-04-02
  • Java中的ThreadLocal详解
    目录一、ThreadLocal简介二、ThreadLocal简单使用 三、ThreadLocal的实现原理1、set方法源码2、get方法源码3、remove方法的实现四、Threa...
    99+
    2024-04-02
  • Java 并发 - ThreadLocal详解
    ThreadLocal是通过线程隔离的方式防止任务在共享资源上产生冲突, 线程本地存储是一种自动化机制,可以为使用相同变量的每个不同线程都创建不同的存储。 @pdaiJava 并发 - ThreadLocal详解带着BAT大厂的面试问题去理...
    99+
    2022-12-02
    java框架 java全栈 java学习路线 java全栈知识 java面试 知识体系 java技术体系 java编程
  • Java ThreadLocal的使用详解
    目录1. 应用场景1.1. 保障线程安全1.2. 显示传递参数2. 实现原理3. 注意事项ThreadLocal是线程私有的局部变量存储容器,可以理解成每个线程都有自己专属的存储容器...
    99+
    2024-04-02
  • Java ThreadLocal的详细解释
    目录一、ThreadLocal简介二、ThreadLocal简单使用三、ThreadLocal的实现原理1、set方法源码2、get方法源码3、remove方法的实现4、如下图所示:...
    99+
    2024-04-02
  • Java并发编程之ThreadLocal详解
    目录一、什么是ThreadLocal?二、ThreadLocal的使用场景三、如何使用ThreadLocal四、数据库连接时的使用五、ThreadLocal工作原理六、小结七、注意点...
    99+
    2024-04-02
  • Java超详细讲解ThreadLocal类的使用
    目录Threadlocal有什么用:ThreadLocal使用实例API介绍ThreadLocal的使用Threadlocal 的源码分析原理源码内部类ThreadLocalMapT...
    99+
    2024-04-02
  • Java中ThreadLocal的用法和原理详解
    目录用法实现原理内存泄漏用法 隔离各个线程间的数据避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal中管理的对象。 package com.exam...
    99+
    2023-05-15
    Java ThreadLocal用法 Java ThreadLocal原理 Java ThreadLocal
  • 详解Java中ThreadLocal类型及简单用法
    目录1 基本概念2 简单使用3 应用场景4 底层原理4.1 set(Object)4.2 get()4.3 remove()4.4 ThreadLocalMap5 内存泄漏隐患和防止...
    99+
    2024-04-02
  • 详解ThreadLocal为什么会内存溢出原理
    目录前言ThreadLocal源码分析ThreadLocal value内存溢出总结前言 关于ThreadLocal (线程本地存储),从字面意思上看主要是存储一些本地变量,使它们...
    99+
    2023-01-04
    ThreadLocal内存溢出 ThreadLocal内存
  • Spring中ThreadLocal的解析
    目录1.ThreadLocal的接口方法2.TheadLocal实例3.Thread同步机制的比较(总结)4.Spring使用ThreadLocal解决线程安全问题  &n...
    99+
    2024-04-02
  • SpringBoot通过ThreadLocal实现登录拦截详解流程
    目录1 前言2 具体类2.1HandlerInterceptor2.2WebMvcConfigurer3 代码实践1 前言 注册登录可以说是平时开发中最常见的东西了,但是一般进入到公...
    99+
    2024-04-02
  • Java ThreadLocal原理解析以及应用场景分析案例详解
    目录ThreadLocal的定义ThreadLocal的应用场景ThreadLocal的demoTheadLocal的源码解析ThreadLocal的set方法ThreadLocal...
    99+
    2024-04-02
  • Android 中ThreadLocal的深入理解
    ThreadLocal前言:    ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,ThreadLocal是一个线程内部的数据存储类...
    99+
    2023-05-30
    android threadlocal roi
  • 快速了解Java中ThreadLocal类
    最近看Android FrameWork层代码,看到了ThreadLocal这个类,有点儿陌生,就翻了各种相关博客一一拜读;自己随后又研究了一遍源码,发现自己的理解较之前阅读的博文有不同之处,所以决定自己写篇文章说说自己的理解,希望可以起到...
    99+
    2023-05-30
    java threadlocal ava
  • 深入理解python中的ThreadLocal
    ThreadLocal在threading模块中,可以见得它是为我们的线程服务的。 它的主要作用是存储当前线程的变量,各个线程之间的变量名是可以相同的,但是线程之间的变量是隔离的,也...
    99+
    2023-03-08
    python ThreadLocal
  • 彻底理解Java 中的ThreadLocal
     ThreadLocal是什么  早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ...
    99+
    2023-05-31
    java threadlocal ava
  • Java多线程 ThreadLocal原理解析
    目录1、什么是ThreadLocal变量2、ThreadLocal实现原理3、内存泄漏问题4、使用场景1)存储用户Session2)解决线程安全的问题3)使用ThreadLocal重...
    99+
    2024-04-02
  • 什么是ThreadLocal
    这期内容当中小编将会给大家带来有关什么是ThreadLocal,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一 引言ThreadLocal的官方API解释为:* ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作