ThreadLocal是线程本地变量,每个线程中都存在副本。

实现原理:

每个线程中都有一个ThreadLocalMap,而ThreadLocalMap中的key即是ThreadLocal。

 内存泄漏:

ThreadLocal变量存储在栈内存中,对应对象存储在堆内存中,这个指向是强引用关系。

同样,ThreadLocalMap变量存储在栈内存中,对应对象key-value存储在堆内存中,也是强引用关系。同时map中的key也指向了threadlocal。

如果ThreadLocal变量被置为空,但是map仍存在引用,会导致堆中的对象无法释放,java已将map中的key优化为弱引用(WeakReference)。

但是value本身也存在强引用的关系,value并不会被释放,所以依然存在内存泄漏问题。

解决方法是,手动调用threadlocal的remove方法。

使用:

 1 public class Main {
2 private static ThreadLocal<Integer> tl = new ThreadLocal<>();
3 public static void main(String[] args) throws InterruptedException{
4 CountDownLatch c = new CountDownLatch(1);
5 ThreadPoolExecutor tpe = new ThreadPoolExecutor(10, 20, 60L, TimeUnit.SECONDS,
6 new ArrayBlockingQueue<>(3));
7 tpe.execute(new Runnable() {
8 @Override
9 public void run() {
10 System.out.println(Thread.currentThread().getName());
11 System.out.println(tl.get());
12 tl.set(1);
13 System.out.println(tl.get());
14 tl.remove();
15 c.countDown();
16 }
17 });
18 tpe.execute(new Runnable() {//模拟
19 @Override
20 public void run() {
21 try{c.await();}catch (InterruptedException e){};//让第一个线程先执行
22 System.out.println(Thread.currentThread().getName());
23 System.out.println(tl.get());
24 tl.set(2);
25 System.out.println(tl.get());
26 tl.remove();
27 }
28 });
29 tpe.shutdown();
30 }
31 }

应用场景:

1,Spring多数据源配置的切换;

2,Spring事务注解的实现;

3,日志框架slf4j中的MDC类的实现

待更多补充。

ThreadLocal实现原理和使用场景的更多相关文章

  1. ThreadLocal 原理和使用场景分析

    ThreadLocal 不知道大家有没有用过,但至少听说过,今天主要记录一下 ThreadLocal 的原理和使用场景. 使用场景 直接定位到 ThreadLocal 的源码,可以看到源码注释中有很清 ...

  2. 深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范 多线程中篇(十七)

    简介 从名称看,ThreadLocal 也就是thread和local的组合,也就是一个thread有一个local的变量副本 ThreadLocal提供了线程的本地副本,也就是说每个线程将会拥有一个 ...

  3. 面试中的 ThreadLocal 原理和使用场景

    相信大家不管是在网上做题还是在面试中都经常被问过 ThreadLocal 的原理和用法,虽然一直知道这个东西的存在但是一直没有好好的研究一下原理,没有自己的知识体系.今天花点时间好好学习了一下,分享给 ...

  4. 线程局部变量ThreadLocal的原理及使用范围_1

    线程局部变量ThreadLocal的原理及使用范围 使用原理 每个Thread中都有一个ThreadLocalMap成员, 该成员是ThreadLocal的内部类ThreadLocalMap类型.每使 ...

  5. ThreadLocal的理解与应用场景分析

    对于Java ThreadLocal的理解与应用场景分析 一.对ThreadLocal理解 ThreadLocal提供一个方便的方式,可以根据不同的线程存放一些不同的特征属性,可以方便的在线程中进行存 ...

  6. Java进阶(七)正确理解Thread Local的原理与适用场景

    原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...

  7. ThreadLocal的原理,源码深度分析及使用

    文章简介 ThreadLocal应该都比较熟悉,这篇文章会基于ThreadLocal的应用以及实现原理做一个全面的分析 内容导航 什么是ThreadLocal ThreadLocal的使用 分析Thr ...

  8. 【转】Thread Local的正确原理与适用场景

    本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ ThreadLocal解决什么问题 由于 ThreadLocal 支持范型,如 Thre ...

  9. ThreadLocal的实现和使用场景

    ThreadLocal 内部实现.应用场景和内存泄漏 深入理解线程局部变量:ThreadLocal <Java源码分析>:ThreadLocal /ThreadLocalMap Threa ...

  10. ThreadLocal的原理及产生的问题

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. ThreadLocal的原理 特点 ThreadLocal和Sychro ...

随机推荐

  1. 【Unity】检测目标是否在视线范围内(附视线范围扇形画法)

    检测目标是否在视线范围内(附视线范围扇形画法) using UnityEngine; public class Test_CanSeeTarget : MonoBehaviour { public G ...

  2. Realtek 平台一些乱七八糟的编译环境设置

    1. 129x 系列之后的就推荐用ubuntu 16.04了 省去一些GCC ,tar,quilt 等问题 Android 平台: sudo apt-get install u-boot-tools ...

  3. sql函数的用法

    1.codename 作为翻译函数 CREATE DEFINER=`root`@`localhost` FUNCTION `codename`(`sys_code` varchar(20),`stat ...

  4. IDEA中使用JDBC连接MySQL数据库报错:No appropriate protocol (protocol is disabled or cipher suites are inappropriate) 的解决方法

    在IDEA中使用JDBC连接MySQL,程序运行之后报错: 定位到第16行: 根据上面报错提示,在url参数字段最前面添加参数  useSSL=false  : 再次运行程序,成功连接到数据库!

  5. Javaweb学习笔记第十四弹---对于Cookie和Filter的学习

    Apache Tomcat - Tomcat Native Downloads 会话追踪技术 会话:打开浏览器,建立连接,直到一方断开连接,会话才会结束:在一次会议中,可以有多次请求. 会话追踪:在多 ...

  6. RHEL8使用NMCLI管理网络

    使用 NMCLI 配置静态以太网连接 要在命令行上配置以太网连接,请使用 nmcli 工具. 例如,以下流程使用以下设置为 enp7s0 设备创建 NetworkManager 连接配置文件: 静态 ...

  7. Z 函数

    简单记一下,避免忘记. z 函数 对于字符串 \(S\),我们将 \(z(i)\) 定义为从 \(i\) 开始的后缀与 \(S\) 的最长公共前缀的长度. \(O(n)\) 求出 z 函数 我们添加一 ...

  8. webpack原理(1):Webpack热更新实现原理代码分析

    热更新,主要就是把前端工程 文件变更,即时编译,然后通知到浏览器端,刷新代码. 服务单与客户端通信方式有:ajax 轮询,EventSource.websockt. 客户端刷新一般分为两种: 整体页面 ...

  9. Linux RedHat 利用 ISO镜像文件制作本地 yum源

    RedHat 利用ISO镜像文件制作本地yum源 [1]创建iso存放目录和挂载目录 1 [root@desktop ~]# cd /mnt/ 2 [root@desktop mnt]# mkdir ...

  10. vue3中watch的写法大合集。

    VUE2的watch是一个属性写法是 watch:{ data1(newVal,oldVal){ 同步/异步操作 } } VUE3的watch则是一个函数,写法是 注意数据必须是响应式的 let nu ...