首页 > 其他分享 >ThreadLocal实现原理和使用场景

ThreadLocal实现原理和使用场景

时间:2022-12-13 11:11:54浏览次数:56  
标签:场景 tl System ThreadLocal new println 原理 out

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类的实现

待更多补充。

标签:场景,tl,System,ThreadLocal,new,println,原理,out
From: https://www.cnblogs.com/hangwei/p/16976206.html

相关文章

  • 深入理解 Spring 事务:入门、使用、原理
    大家好,我是树哥。Spring事务是复杂一致性业务必备的知识点,掌握好Spring事务可以让我们写出更好地代码。这篇文章我们将介绍Spring事务的诞生背景,从而让我们可以更清晰......
  • ElasticSearch原理篇
    一、开篇几个问题 1、大规模数据如何检索?当系统数据量上了10亿、100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑:1)用什么数据库好?(MySQL、sybase、Oracle、达......
  • 【数据库】数据库 不同场景下 推荐
    目录​​场景​​​​大数据存储数据仓库​​​​Hive​​​​数据实时分析​​​​TIDB​​​​各数据库介绍​​​​TiDB开源分布式关系型数据库​​​​Hive数据仓库......
  • 【Java】ThreadLocal 可以在指定线程内存储数据,只有指定线程可以得到存储数据
     一般事务会用到 ThreadLocal可以保障同一个线程用同一个Connection 可以参考 ThreadLocal是线程的内部存储类,可以在指定线程内存储数据。只有指定线程可以得到存储......
  • servlet原理
      service方法的两个参数,一个request接受从浏览器传过来的请求通过xml文件里指向的类里边的doget或者dopost方法接受,处理后返回一个respo参数......
  • 谈谈项目中单点登录的实现原理?
    注:单点登录原理是一个重要知识点,也常被问及,很多童鞋照葫芦画瓢搭建过单点登录,但是被问到原理时可能说不出来,下面简单介绍,抛砖引玉,希望对大家有所帮助。单点登录在现在的系......
  • 数字孪生场景、代码即开即用 | 图观引擎 超详细功能范例演示
    数字孪生已经从一项前沿技术,演变成为各行各业数字化转型的必选项。过去想要构建数字孪生应用,要面对视觉设计、三维底座构建、代码开发、数据对接、部署联调等一系列复杂工......
  • 第一章:手写简易的web框架,了解Django的原理
    手写一个简单的web框架纯手撸简易版的web框架importsocket#括号后面什么都不加默认tcp协议server=socket.socket()#访问地址server.bind(('127.0.0.1',8080)......
  • SpringBoot 自动装配的原理分析
    关于SpringBoot的自动装配功能,相信是每一个Java程序员天天都会用到的一个功能,但是它究竟是如何实现的呢?今天阿粉来带大家看一下。自动装配案例首先我们通过一个案例......
  • 用通俗易懂的大白话讲解Map/Reduce原理
    下面是我自己的微信公众号(不定期更新JAVA、大数据、个人成长等干货)1、公众号上有经典的技术电子书可以免费领2、大家有问题可以在公众号问我,只要你问了我就会回复(相互交流......