直接开始
之前在写自定义注解实现多数据源的那篇文章中用过这个ThreadLocal,用这个主要是让每个线程内部有自己独立的数据源信息,就意味着每个线程内部存储着一个单独的数据库连接,这是开始,来看一下是怎么实现的。
概述
这个在我看来,看懂了之后很好理解,其实就是在Thread里面维护了一个ThreadLocalMap,然后就做到了线程里面的数据隔离,这个Map用当前线程来做key值,需要存储的对象作为value。大致的意思就是这样了,回过头来说说之前写的自定义注解实现多数据源达到读写分离的目的就是这样,每个方法调用的线程,在执行时,会去判断是使用的哪个数据源,然后切换,保存到ThreadLocalMap里面,保证了当前方法里面都是从指定的数据源操作数据
源码
不多说了,也没什么说的,直接看源码吧,挺简单的,主要是两个方法 get() ,set()。
1 | /** |
get和set到这就没了,这两个方法挺简单的,但是ThreadLocalMap里面是维护的一个Entry数组,这个数组使用的是弱引用,弱引用在深入理解Java虚拟机的时候讲了一下,这里用上了,就在看看
弱引用:
WeakReference 在每次执行GC的时候就会将这块清除掉,不用管内存是否足够,但是这里有个问题,就是只在key上面用了弱引用,但是此时value值还没有被垃圾回收,所以要完全回收这块的数据,只靠弱引用是没办法完全清除的,必须要调用一下ThreadLocal的remove方法,他会将value的值设置为null,等待GC