6.4线程封闭

线程封闭

线程封闭:把对象封装到一个线程里,只有这一个线程能看到这个对象,这样,即使该对象不是线程安全的,也不会带来线程安全问题

如何实现线程封闭?

  • Ad-hoc线程封闭:程序控制实现,最糟糕,忽略

  • 堆栈封闭:局部变量,无并发问题。多个线程访问一个方法的时候,每个线程都会拷贝一份局部变量到线程的栈中。

  • ThreadLocal线程封闭:特别好的封闭方法,ThreadLocal内部是一个map,map的key是线程的名称,map的值就是我们要封闭的对象

演示ThreadLocal

1.创建一个bean

package com.moluo.moapi.security.filter;

public class RequestHolder {

    private final static ThreadLocal<Long> requestHolder = new ThreadLocal<>();

    public static void add(Long id) {
        requestHolder.set(id);
    }

    public static Long getId() {
        return requestHolder.get();
    }

    public static void remove() {
        requestHolder.remove();
    }

}
  1. 使用过滤器向ThreadLocal中放数据

注册过滤器

3.使用拦截器在方法处理完后移除ThreadLocal中的数据

注册拦截器(继承WebMvcConfigurerAdapter类,重写addInterceptors方法)

4.controller

5.使用postman访问 GET http://127.0.0.1:8080/threadLocal/test 将返回线程ID

Last updated

Was this helpful?