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. ZFBJ - 1 - 42 - NO.2

  2. maven使用junit测试报class not found

    突然就找不到类,查了一下是因为使用了Clean的命令,把编译好的class文件清理掉了,在Maven中使用test进行测试就可以了

  3. pod控制器

    Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后 ...

  4. 8.forEach的使用

    1 List<customer> list //一个类是customer的列表 2 3 /* for(int i = 0;i < list.size();i++){ 4 System ...

  5. win10下Word点击链接跳转,提示“由于本机的限制,该操作已取消”

    Word按住Ctrl点击链接进行跳转,提示"由于本机的限制,该操作已取消,请联系管理员" 网上很多,修改注册表 这边要说的是,修改重启word ,还不行的解决方法:点开任务管理器- ...

  6. useBean类属性[javaChuLi.LoginBean]的值无效

    今天遇到了一个错误,如图 参见:JSP 中给定的 useBean 标签的 class 属性的值无效_dkawskawx的博客-CSDN博客

  7. 记录一次mybatis pagehelper count order by 不生效

    https://sample.blog.csdn.net/article/details/119216433?spm=1001.2101.3001.6650.5&utm_medium=dist ...

  8. 手写一个简易的ajax

    function ajax(url,successFul){ const xhr=new XMLHttpRequest() xhr.open("Get",url,true) xhr ...

  9. 自动化兼容性测试工具——WeTest

    这个作业属于哪个课程 2021春软件工程实践|W班(福州大学) 这个作业要求在哪里 软件工程实践总结&个人技术博客 这个作业的目标 分享自动化兼容性测试工具的使用 其他参考文献 ... 目录 ...

  10. centos7下安装Node.js MongoDB Nginx

     一.Node.js 方法1(笔者采用).如果对Node.js环境有比较高的要求,建议选择源码安装的方式进行安装,通过wget命令下载Node.js官网上的tar.gz文件包到centos服务器上,进 ...