其他分享
首页 > 其他分享> > ThreadLocal及常用场景

ThreadLocal及常用场景

作者:互联网

ThreadLocal

ThreadLocal是Java中的为解决多线程间数据隔离的解决方案,其底层依赖于Java的内存模型,依赖于当前执行线程的内存来完成对数据的存取操作。
一般在使用时,在对象中创建ThreadLocal泛型变量,在之后进行到调度时从中取出ThreadLoacal中存储的数据以便后续业务操作。

Class Data {
  private ThreadLocal<String> threadLocal = new ThreadLocal<>();
}

ThreadLocal的API操作:

  1. T get(),返回存储在ThreadLocal中的数据,泛型
  2. Protected T initialValue(),创建ThreadLocal变量时设置默认值,在创建时重写实现
  private ThreadLocal<String> threadLocal = new ThreadLocal(){
                @Override
                protected String initialValue() {
                    //获取并返回默认值
                    return "默认值");
                }
            };
  1. void remove(),删除数据
  2. static ThreadLocal withInitial(Supplier<? extends T> supplier),同样是在创建ThreadLocal变量时设置默认初始值
    private ThreadLocal<String> threadLocal=
            ThreadLocal.withInitial(new Supplier<String>() {
                @Override
                public String get() {
                    //返回默认值
                    return "默认值";
                }
            });

常见使用场景

  1. 代替参数传递
    在API接口传入参数到controller层之后,众多的参数时显示的到达实际业务处理层中,可以使用ThreadLocal来隐性的接收参数,在之后的业务处理是就不需要显示的了解传入的参数。缺点:不利于业务的理解,使用复杂
  2. 解析信息
    常用于存储用户登录信息,Session或者Token等。在用户登录时,使用拦截器将登录信息统一写入到ThreadLocal中,在后续调用到用户信息时,直接get,就无需进行查表、rpc或rest调用的步骤。缺点:仅使用于该信息不常变动的场景,如无状态登录
  3. 资源隔离
    对于Spring中的bean对象,默认装配的都是单例对象,其中的有些数据在多线程统一请求时,可能造成资源冲突,这时候就可以为其添加ThreadLocal变量,使得每个使用该单例bean对象的线程请求都有属于自己的变量分区。以Spring中DAO层连接数据库的connection为例,其与数据库连接的背后就使用了ThreadLocal。在线程请求连接数据库时,若ThreadLocal对象为null,则说明该线程没有获得数据库连接,否则就直接复用该连接。很好的起到了多线程之间资源隔离的效果。

标签:常用,场景,变量,get,多线程,ThreadLocal,使用,默认值
来源: https://www.cnblogs.com/jijdy/p/16449118.html