专栏首页琦小虾的BinaryJava并发技术总结之二——ThreadLocal

Java并发技术总结之二——ThreadLocal

接上篇《Java并发技术总结之一——Java线程池》

二. ThreadLocal

参考地址:《Java中的ThreadLocal详解》

ThreadLocal 用来保证规避多线程访问线程不安全的情况,每个线程访问自己的副本变量,这样就避免了对资源的抢占导致数据不一致的问题。

2.1 原理

线程 Thread 中用 ThreadLocalMap 类型的 threadLocals, inheritableThreadLocals 存储当前线程与子线程数据的副本变量。 ThreadLocal 是不支持继承的,子线程在 ThreadLocal 中无法获取到父线程的副本。所以为了访问父线程的变量,Thread 类提供了 inheritableThreadLocals 字段。创建线程时调用 init() 方法,会判断父线程,也就是当前线程的 inheritableThreadLocals 是否为 null。如果不为 null,就会将数据存入 inheritableThreadLocals 中,用来获取父线程的 ThreadLocal 值,创建子线程时,会将父线程的 inheritableThreadLocals 复制给子线程。由于 InheritableThreadLocal 类继承与 ThreadLocal,而且重写了 get, set 方法,所以此后对 ThreadLocalMap 的操作,都是对 inheritableThreadLocal 执行的。

2.2 内存泄漏问题

由于 ThreadLocalMap 的 Entry 中,Key 字段是继承于 WeakReference 的,属于弱引用,只要被 GC,就会被回收。而 Entry 的 Value 如果是强引用,那么触发的一次 GC 会将 Key 回收,而强引用的 Value 由于与 Thread 有联系,所以只要该线程不结束,该 Value 不会被 GC 回收,这样就造成了内存泄漏。 所以在实际使用完 ThreadLocalMap 后,要及时的调用 remove 方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java并发技术总结之一——Java线程池

    注:1, 2, 3 步骤在 ThreadPoolExecutor # execute(Runnable command) 方法中;

    剑影啸清寒
  • JVM技术总结之六——JVM的锁优化

    由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,CPU 划分出两个权限等级:用户态和内核态。

    剑影啸清寒
  • Java并发技术总结之三——线程状态

    线程有六种状态:NEW, RUNNABLE(RUNNING), WAITING, TIME_WAITING, BLOCKED, TERMINATED。

    剑影啸清寒
  • java 线程总结(一)

    一个Java程序的运行不仅仅是main()方法的运行,而是main线程和多个其他线 程的同时运行。

    爱明依
  • 阿里大佬带你,深入理解线程池底层原理

    在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。 因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处...

    李红
  • C#多线程之旅(1)——介绍和基本概念

    悟空聊架构
  • 线程池ThreadPoolExecuter使用详解

    使用过jdk自带线程池或者看过源码的都知道,jdk1.5版本引入了并发包,线程池就是其中一个比较重要的内容,所谓线程池和连接池以及其他池子一样,其核心概...

    Typhoon
  • 面试官:Java线程池了解?如果你还回答不好,那还不赶快收藏!

    本文将根据面试中常被问到的 Java线程池 展开抽丝剥茧的解析,这个问题可以说是百分之百会在Java程序员面试中被问到,因为在工作中这个需求实在是太普遍了。Ja...

    捡田螺的小男孩
  • 操作系统概念学习笔记 9 线程

    线程是CPU使用的基本单元,它由线程ID、程序计数器、寄存器集合和栈组成。它与属于统一进程的其他线程共享代码段、数据段和其他操作系统资源。

    种花家的奋斗兔
  • 面试官:怎样去运用线程池?工作中如何使用?

    工作中,我们有时候需要实现一些耗时的任务。比如:将 Word 转换成 PDF 存储的需求。

    业余草

扫码关注云+社区

领取腾讯云代金券