抛砖引玉之threadlocal

1、threadlocal原理

threadlocal从名字上就知道跟thread有关系,threadlocal拆开来就是thread、local,线程、本地, ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。

ThreadLocal 是一个泛型类,保证可以接受任何类型的对象,threadlocal有一个threadLocalMap内部类,这个内部类存储了theadlocal需要的对象。

threadlocal最主要的就是get set 和remove方法,这三个方法其实就是操作threadlocalMap的对象。

抛砖引玉之threadlocal

 

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()方法。

抛砖引玉之threadlocal