本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!前端
今天是我在掘金的第二篇文章,感谢阅读,并但愿之后持续关注,我会输出更多技术干货,咱们共同进步!面试
之后可能会分为几大专题,相似于并发专题,源码专题,面试专题等(只会分享干货)。redis
请出今天的主角: ThreadLocal后端
ThreadLocal 很好理解:Thread(线程)、local(本地)缓存
那么你大概就明白了,这个东西是属于本地线程。能够理解map本地缓存之类的,可是这里面有thread,并不是共享数据,而是每一个线程都有本身的一个空间,互不影响。那么接下来经过具体业务场景了解其背后的用法:安全
该场景的具体分析能够点击查看:ThreadLocal 使用场景02markdown
接下来看代码演示并发
/**
* 变量存储
* @author yn
* @date 2021/7/11
*/
public class LocalContext {
//初始化 ThreadLocal 将用户信息装进Local
private static final ThreadLocal<Node> LOCAL = new InheritableThreadLocal<Node>(){
@Override
protected Node initialValue() {
return new Node();
}
};
/**
* 将userID装进本地缓存
* @param userId
*/
public static void setUserId(Integer userId){
LOCAL.get().setUserId(userId);
}
/**
* 获取用户
* @param userId
*/
public static Integer getUserId(){
return LOCAL.get().getUserId();
}
/**
* 清除本地变量
*/
public static void remove(){
LOCAL.remove();
}
....省略其余信息
}
/**
* 定义用户
* @author yn
* @date 2021/7/11
*/
@Data
public static class Node {
private Integer userId;
private String openId;
private String mobile;
private String appId;
public Node(){
this.userId = 0;
this.openId = "";
this.mobile = "";
this.appId = "";
}
}
复制代码
以上就是操做ThreadLocal的一个简单工具类,是否是感受有点像redis、map之类。app
首先 ThreadLocal 是一个泛型类,保证能够接受任何类型的对象。ide
由于一个线程内能够存在多个 ThreadLocal 对象,因此实际上是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫作 ThreadLocalMap 的静态内部类。而咱们使用的 get()、set() 方法其实都是调用了这个ThreadLocalMap类对应的 get()、set() 方法。
更深的咱们先不讨论,后面我会把它放到源码专题作出详细讨论。感谢你们的阅读,但愿对你有帮助。欢迎你们点赞、评论、转发。
最近全国大部门地区暴雨来袭,但愿你们出门带好雨具,注意安全。话说回来,北京说好的暴雨呢,各类防范措施都已就绪,怎么还不见下呢。