19
2020
02

解决 ThreadLocal 内存溢出的关键代码是什么?

答:关键代码为 threadLocal.remove() ,使用完 ThreadLocal 之后,调用remove() 方法,清除掉 ThreadLocalMap 中的无用数据就可以避免内存溢出了。
19
2020
02

ThreadLocal 为什么会发生内存溢出?

答:ThreadLocal 造成内存溢出的原因:如果 ThreadLocal 没有被直接引用(外部强引用),在 GC(垃圾回收)时,由于 ThreadLocalMap 中的 key 是弱引用,所以一定就会被回收,这样一来 ThreadLocalMap 中就会出现 key 为 null 的 Entry,并且没有办法访问这些数据,如果当前线程再迟迟不结束的话,这些 key 为 null 的 Entry 的 value 就会一直存在一条强引用链:Thread Ref -> Thread ->
19
2020
02

ThreadLocal 如何共享数据?

答:通过 ThreadLocal 的子类 InheritableThreadLocal 可以天然的支持多线程间的信息共享。
19
2020
02

为什么ThreadLocal变量要设置成 static 修饰?

如果把ThreadLocal声明为某个类的非静态变量,也就是实例变量,那么每次创建该类的实例时,都会导致创建等同的对象,这些重复的对象会导致浪费。
19
2020
02

ThreadLocal的应用场景

ThreadLocal适用于独立变量副本的情况,如果变量为全局共享的,则不适用了。一个典型的应用场景是数据库连接管理,每个线程访问数据库都应当是一个独立的Session会话,如果多个线程共享同一个Session会话,有可能出现其他线程关闭连接了,而当前线程再执行提交时出现会话已关闭的异常。如果采取ThreadLocal的方式能避免线程争抢Session,提高并发下的安全性。
19
2020
02

为什么 ThreadLocalMap 的 key 是弱引用?

如果 key 是强引用,那么发生 GC 时 ThreadLocalMap 还持有 ThreadLocal 的强引用,会导致 ThreadLocal 不会被回收,从而导致内存泄漏。弱引用 ThreadLocal 不会内存泄漏,对应的 value 在下一次 ThreadLocalMap 调用 set、get、remove 方法时被清除,这算是最优的解决方案。