并发编程之:ThreadLocal (2)

代码中循环遍历tab,首先获取到下标i对应的对象,如果不为空,则执行循环体,如果在循环体中的两个条件都不满足,则会执行nextIndex()方法,这个方法的代码如下:

private static int nextIndex(int i, int len) { return ((i + 1 < len) ? i + 1 : 0); }

这个方法的逻辑就是开放寻址法。而HashMap则是通过拉链法rehash来做的。

哪些场景使用

通过上面的内容基本可以掌握ThreadLocal的基本用法,那么ThreadLocal主要在什么场景中使用呢。

ThreadLocal的作用通过以上了解我们知道主要是用来做线程间数据隔离。那么在什么场景下能用到线程隔离呢?

首先想到的就是SimpleDateFormat这个工具类,它不是线程安全的,可以通过ThreadLocal在每个线程中放一份,保证线程安全。

还有比如说用户登录的session,或者token数据,只数据当前会话线程,也可以通过ThreadLocal存储。

再比如在某些场景下,上下文数据在不同方法之间调用,传递起来非常麻烦,可以通过ThreadLocal存放,只需要在需要用到的地方获取就可以。

除了这些场景,在某些框架源码中也会使用到,比如Spring中的事务也主要是通过ThreadLocal和面向切面编程AOP实现的,感兴趣的同学可以查看源码了解。

避免踩坑

内存泄漏

ThreadLocalMap中的Entry的Key是一个弱引用,因此如果在使用后不调用remove方法清除掉会导致对应的value内存泄漏。所以在使用完以后一定要记得调用remove方法清除数据。

image

好的,今天的内容就到这里,我们下期再见。
关注我的公众号【黑子的学习笔记】干货内容第一时间送达。

image

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzdjz.html