ThreadLocal是什么
ThreadLocal是一个关于创建线程局部变量的类。是线程私有的。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。
虽然ThreadLocal并不在java.util.concurrent包中而在java.lang包中,但更倾向于把它当作是一种并发容器(虽然真正存放数据的是ThreadLoclMap)进行归类。从ThreadLocal这个类名可以顾名思义的进行理解,表示线程的“本地变量”,即每个线程都拥有该变量副本,达到人手一份的效果,各用各的这样就可以避免共享资源的竞争。
在实际项目中我们需要将一些信息放到单个线程里,比如,前端传过来的token等。
用法
(1)ThreadLocal是支持泛型的,首先创建存储的对象(若存储的是基本数据类型,则不需要创建)
public class BaseSignatureRequest {
private String token;
private String userId;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
(2)创建ThreadLocal变量
public class ThreadLocalCache {
public static ThreadLocal<BaseSignatureRequest>
baseSignatureRequestThreadLocal = new ThreadLocal<>();
}
(3)设置值
//token放入threadLocal
BaseSignatureRequest baseSignatureRequest = new BaseSignatureRequest();
baseSignatureRequest.setToken(String.valueOf(result.getData()));
baseSignatureRequest.setUserId(userId);
ThreadLocalCache.baseSignatureRequestThreadLocal.set(baseSignatureRequest);
(4)获取值(用完后删除,防止内存溢出)
BaseSignatureRequest baseSignatureRequest = ThreadLocalCache.baseSignatureRequestThreadLocal.get();
//使用后清理ThreadLocal
ThreadLocalCache.baseSignatureRequestThreadLocal.remove();
原理
参考:http://con.zhangjikai.com/ThreadLocal.html
https://juejin.im/post/5aeeb22e6fb9a07aa213404a
https://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/