抛砖引玉之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()方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值