ThreadLocal


简介

ThreadLocal主要解决让每个线程绑定自己的值,可以将ThreadLocal比喻成放数据的盒子,盒子中可以存储每个线程的私有数据;

如果创建了一个ThreadLocal遍历,那么访问这个变量的每个线程都会有这个变量的本地副本,他们可以使用get或set方法来获取或修改当前线程所存的副本的值,从而避免了线程安全的问题。

数据结构

  1. 它是一个数组
  2. 数据元素采用哈希散列方式进行存储,这里的散列使用的是斐波那契散列
  3. 这里不同于HashMap的数据结构,发生哈希碰撞不会存在链表或红黑树,而是使用拉链法进行存储。

实现原理

底层是通过ThreadLocalMap实现的,每个Thread对象中都存在一个ThreadLocalMap,Map的key为ThreadLocal对象,value为需要缓存的值

内存泄漏问题

ThreadLocalMap中的key为ThreadLocal的弱引用,但是value却是强引用。如果ThreadLocal没有被外部强引用的情况下,在垃圾回收的时候,key会被清除但是value不会被清除掉,所以使得ThreadLocalMap会存在key为null的entry。如果不做任何措施,value会无法被GC回收,这个时候可能会产生内存泄漏问题,所以使用完之后需要我们手动调用ThreadLocal的remove()方法。

  • 弱引用介绍

    垃圾回收时会直接回收掉,不管当前内存空间足够与否,都会回收它的内存

  • 强引用

    也就是new出来的对象,当内存不足的时候,JVM宁愿出现OOM错误,也需要保存这个对象,并且永远不会被GC回收,当然可以手动对对象进行弱化使其可以被回收 object = null;




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 2379. Minimum Recolors to Get K Consecutive Black Blocks
  • 2471. Minimum Number of Operations to Sort a Binary Tree by Level
  • 1387. Sort Integers by The Power Value
  • 2090. K Radius Subarray Averages
  • 2545. Sort the Students by Their Kth Score