ThreadLocal的理解
- ThreadLocal是每个线程自己的变量;每个线程保存一个ThreadLocalMap的变量,来保存ThreadLocal类型数据(可能一个线程有多个ThreadLocal数据)。
- 线程是CPU资源调度的最小单位,我们的程序在操作系统中基本是以线程的形式在运行。
- 这样就有一个好处,无论在哪个类中,都可以获取当前线程的全局变量,不需要拘泥于方法之间的相互传参问题。
- 比如说一个Requst请求过来了,其实Tomcat为每个请求都创建了一个Servlet线程。我们可以把全局需要用到的Session、Region等等存放在,这个线程的ThreadLocalMap变量中,然后无论在哪里都可以随便使用。
用ThreadLocal实现动态路由
- 简单理解ThreadLocal原理和适用场景,多数据源下ThreadLocal的应用
- ThreadLocal实现动态路由的过程中,我们利用AOP自动切换。需要注意,除了参数自动切换外,我们还需要提供工具类手动切换。
Java中的引用类型
- 强引用:强引用关联的对象,永远不会被GC回收
- 软引用:SoftReference,指的是那些有用但是不是必须要的对象。系统在发生内存溢出前会对这类引用的对象进行回收。
- 弱引用:WeakReference,弱引用的对象下一次GC的时候一定会被回收
- 虚引用:当发生GC的时候,虚引用也会被回收
ThreadLocal内存泄漏问题
ThreadLocalMap包含Entry数组,Entry是弱引用。弱引用在触发GC的时候,会被回收。key是ThreadLocal类型,value是obj对象。Entry会被回收,但是线程中value对应的对象不会被回收,除非线程结束。
解决方法:在使用完后,调用remove方法删除Entry对象。
参考:ThreadLocal原理