ThreadLocal及常用场景
作者:互联网
ThreadLocal
ThreadLocal是Java中的为解决多线程间数据隔离的解决方案,其底层依赖于Java的内存模型,依赖于当前执行线程的内存来完成对数据的存取操作。
一般在使用时,在对象中创建ThreadLocal泛型变量,在之后进行到调度时从中取出ThreadLoacal中存储的数据以便后续业务操作。
Class Data {
private ThreadLocal<String> threadLocal = new ThreadLocal<>();
}
ThreadLocal的API操作:
- T get(),返回存储在ThreadLocal中的数据,泛型
- Protected T initialValue(),创建ThreadLocal变量时设置默认值,在创建时重写实现
private ThreadLocal<String> threadLocal = new ThreadLocal(){
@Override
protected String initialValue() {
//获取并返回默认值
return "默认值");
}
};
- void remove(),删除数据
- static
ThreadLocal withInitial(Supplier<? extends T> supplier),同样是在创建ThreadLocal变量时设置默认初始值
private ThreadLocal<String> threadLocal=
ThreadLocal.withInitial(new Supplier<String>() {
@Override
public String get() {
//返回默认值
return "默认值";
}
});
常见使用场景
- 代替参数传递
在API接口传入参数到controller层之后,众多的参数时显示的到达实际业务处理层中,可以使用ThreadLocal来隐性的接收参数,在之后的业务处理是就不需要显示的了解传入的参数。缺点:不利于业务的理解,使用复杂 - 解析信息
常用于存储用户登录信息,Session或者Token等。在用户登录时,使用拦截器将登录信息统一写入到ThreadLocal中,在后续调用到用户信息时,直接get,就无需进行查表、rpc或rest调用的步骤。缺点:仅使用于该信息不常变动的场景,如无状态登录 - 资源隔离
对于Spring中的bean对象,默认装配的都是单例对象,其中的有些数据在多线程统一请求时,可能造成资源冲突,这时候就可以为其添加ThreadLocal变量,使得每个使用该单例bean对象的线程请求都有属于自己的变量分区。以Spring中DAO层连接数据库的connection为例,其与数据库连接的背后就使用了ThreadLocal。在线程请求连接数据库时,若ThreadLocal对象为null,则说明该线程没有获得数据库连接,否则就直接复用该连接。很好的起到了多线程之间资源隔离的效果。
标签:常用,场景,变量,get,多线程,ThreadLocal,使用,默认值 来源: https://www.cnblogs.com/jijdy/p/16449118.html