ThreadLocal 是什么?

ThreadLocal是 java 提供的一种线程局部变量,在 多线程环境下,它可以防止自己的变量被其他线程篡改,可以解决线程安全问题 (比使用synchronized更简单、方便,且 并发性 也更高)

ThreadLocal 原理

ThreadLocal 关系图

  • Entry 对象的 keyThreadLocal, value实际变量的副本 (保证线程安全)
  • ThreadLocalMap类是ThreadLocal类的静态内部类,而EntryThreadLocalMap的静态内部类,其中 keyThreadLocal(声明为 弱引用),value 是Object,也就是我们要存的值。
  • 在ThreadLocal中,进行get,set操作的时候会清除Map里所有key为null的value。

内存泄漏

但因为ThreadLocal是通过ThreadLocalMap实现的,而ThreadLocalMap生命周期 和当前线程一样长,当线程一直不结束的情况下,如果没有释放,就可能导致 内存泄漏

1
2
3
4
5
6
7
ThreadLocal<Integer> localNumber = new ThreadLocal();
try {
localNumber.set(1);
// code
} finally {
localNumber.remove();
}

为了避免内存泄漏,使用完ThreadLocal之后,记得要调用remove方法。

ThreadLocal 使用场景

ThreadLocal可以用来解决 数据库连接、还有 session 管理等。