• ThreadLocal的底层原理


    ThreadLocal的基本使用

    创建一个ThreadLocal对象:

    private ThreadLocal<Integer> localInt = new ThreadLocal<>();
    

    上述代码创建一个localInt变量,由于ThreadLocal是一个泛型类,这里指定了localInt的类型为整数。

    下面代码是如果设置和获取这个变量的值:

    1. public int setAndGet(){
    2. localInt.set(8);
    3. return localInt.get();
    4. }

    上述代码设置变量的值是8,接着取得这个值。

    由于ThreadLocal里设置的值,只有当前线程自己看得见,这意味着你不可能通过其他线程为它初始化值。为了弥补这一点,ThreadLocal提供了一个withInitial()方法统一初始化所有线程的ThreadLocal的值:

    private ThreadLocal<Integer> localInt = ThreadLocal.withInitial(() -> 6);
    

    上述代码将ThreadLocal的初始值设置为6,这对全体线程都是可见的。

    1. ThreadLocal 是 java 中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据

    2. ThreadLocal 底层是通过 ThreadLocalMap 来实现,每个 Thread 对象(注意不是 ThreadLocal对象)中都存在一个 ThreadLocalMap,Map 的 key 为 ThreadLlocal 对象,Map 的Value 为需要缓存的值

    3. 如果在线程池中使用 ThreadLocal 会造成内部泄露,因为当 ThreadLocal 对象使用完之后,应该要把设置的 Key ,Value ,也就是Entry 对象进行回收,但线程池中的线程不会回收,而线程对象是通过强引用指向 ThreadLocalMap ,ThreadLocalMap 也是通过强引用指向Entry对象,线程不被回收,Entry对象也就不会回收,从而出现内存泄露,解决办法是在使用ThreadLocal 对象之后,手动调用ThreadLocal 的remove 方法,手动清除Entry对象

    4. ThreadLocal 经典的应用场景就是连接管理(一个线程持有一个连接,该连接对象可以在不同的方法之间进行传递,线程之间不共享同一个连接)


    以上是简单描述ThreadLocal的底层,后面会继续讲述 ThreadLocal 实现原理分析,请大家多多指导,谢谢

  • 相关阅读:
    基于STM32与FreeRTOS的消息传递详解(HAL库)
    【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系
    hadoop2.8.2分布式集群实战
    国际腾讯云自主拼装直播 URL教程!!!
    局域网下多台windows电脑时间同步
    Python中的Paramiko与FTP文件夹及文件检测技巧
    《QT+PCL第六章》点云配准icp系列4
    Python 中格式化字符串及 format 函数用法
    ES中 Nested 类型的原理和使用
    DeFi:解决 EIP-4626 中的滑点问题
  • 原文地址:https://blog.csdn.net/wm31898/article/details/127931027