ThreadLocal的理解


    主要是作为线程间的一个共享变量,虽然每个线程都能访问这个共享变量,但是每个thread放进去的内容只能本thread看到,别的thread看不到,常见的使用场景有Spring的@transaction和MyBatis 分页查询,具体源码解读可以参考下面的一系列图片

    对于Threadlocal而言,使用弱引用是为了避免 new 出来的ThreadLocal对象内存泄露,因为如果换成强引用,那当在应用中将tl置为null的时候,该ThreadLocal对象因为还有强引用在指着所以就不会被会回收,这个线程不结束就一直回收不了。
还有另外一种内存泄露的场景是如果ThreadLocals这个map的key 在置为null,同时也执行了垃圾回收之后,则key变为null,这个时候的value将永远获取不到,也释放不掉,这就又产生了内存泄露,避免这个泄露的场景是,养成良好的开发习惯,ThreadLocalMap中的内容不用的时候,一定remove掉

原文地址:https://www.cnblogs.com/hopeiscoming/p/12805823.html