一 介绍
thread threadlocal threadlocalmap 之间的关系
一个thread里面包含一个threadlocalmap,threadlocalmap以entry[] key value的形式 ,key里面放threadlocal对象 ,value里面放值
二 两大使用场景
2.1 每个线程需要一个独立对象 ,比如工具类不安全
例子
1. 两个线程使用 时间格式转换工具类,new两个对象
2. 如果是1000个线程,使用线程池 并发会出现线程不安全
3.尝试把时间格式对象放入每个线程当中,这样保证了线程安全
2.2 每个线程都需要全局变量 比如用户信息
拦截器里面的用户信息, 每个服务都需要 传参不够利索 ,把用户信息放入一个线程中的threadlocalmap中 其它服务需要的话 直接获取就可以了。
三 内存泄漏的原因,如何避免?
threadlocalmap 里面 entry[] key是弱引用 value是强引用 GC会把弱引用给回收,导致value用不上也不释放内存,正常情况下 线程结束,都会回收,但是在线程池的线程一直在工作,如果key回收 value不回收 就会导致内存泄漏,如何避免呢 使用完threadlocal对象之后,应该删除,调用remove方法
set remove refash 方法有先判断key是否为空 为空会置value为空
四 好处
1.线程安全
2.保证线程安全,没有使用锁,提高效率
3.免去了传神的麻烦
4.每个线程保存信息 内存换效率