张春 发表于 2023-8-3 10:00:22

如何正确使用 ThreadLocal,你真的用对了吗?

引言:

当多线程访问共享且可变的数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要ThreadLocal出场了。
ThreadLocal又称线程本地变量,使用其能够将数据封闭在各自的线程中,每一个ThreadLocal能够存放一个线程级别的变量且它本身能够被多个线程共享使用,并且又能达到线程安全的目的,且绝对线程安全。一般用法如下:
public final static ThreadLocal PARAMS = new ThreadLocal();
PARAMS代表一个能够存放String类型的ThreadLocal对象。此时不论什么一个线程能够并发访问这个变量,对它进行写入、读取操作,都是线程安全的。
实际上可以把企微会话存档的相关配置参数存入到ThreadLocal中,各个方法内需要使用直接从ThreadLocal中获取就可以了.
原理:我们先看一下ThreadLocal的结构:

https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2022-10-25-15-08iQh2510bpmbqtKtoM.png
首先是set方法:

https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2022-10-25-15-24WWbCsZpyGDGXRHk.png
这块代码其实很有意思,我们发现在向ThreadLocal中存放值时需要先从当前线程中获取ThreadLocalMap,最后实际是要把当前ThreadLocal对象作为key、要存入的值作为value存放到ThreadLocalMap中,那我们就不得不先看一下ThreadLocalMap的结构。
https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2022-10-25-15-127k6WuSNFbLGYZC3.png
部分核心代码:
    static class ThreadLocalMap {      // 键值对实体的存储结构      static class Entry extends WeakReference
页: [1]
查看完整版本: 如何正确使用 ThreadLocal,你真的用对了吗?