抛砖引玉之threadlocal
1、threadlocal原理
threadlocal从名字上就知道跟thread有关系,threadlocal拆开来就是thread、local,线程、本地, ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。
ThreadLocal 是一个泛型类,保证可以接受任何类型的对象,threadlocal有一个threadLocalMap内部类,这个内部类存储了theadlocal需要的对象。
threadlocal最主要的就是get set 和remove方法,这三个方法其实就是操作threadlocalMap的对象。
2、threadlocal的使用场景
这个类存储的数据存在于一个线程的整个生命周期,所以使用它基本就是在一个线程中,相当月一个线程的全局变量
2.1 基本的业务流程中,如果数据用参数传递是否很复杂也很啰嗦,程序可读性和功能复用性都有问题,举例如果一个流程中有10个节点,第九个需要第一个节点的一个参数,是不是就要从第一个传到第九个是不是很恶心,而且第二个到第八个都没啥用很有可能出现问题。如果放在threadlocal中就没这个问题,所以业务流程中充当数据总线。
2.2 程序的aop,当初有个项目需要手动做一个分表功能,在查询前输入page,pageSize,在查询sql中重写查询sql,从threadlocal取出数据,做出我们想要的额处理。
2.3 pagehelper这个插件都是使用threadlocal实现的。翻源码可以找到
public static <T> Page<T> getLocalPage() {
return LOCAL_PAGE.get();
}
public static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}
private static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
3、threadlocal的注意点
threadlocalMap的entrey是弱引用,弱引用埋下了伏笔,threadlocal必须得手动清理,否则就会出现内存泄漏。所以每次使用完ThreadLocal,都调用它的remove()方法。