Spring的bean用ThreadLocal保证线程安全

  • Post author:
  • Post category:其他


我们知道,spring中并没有对于单例的bean实现线程安全,所以通常需要开发者自己实现线程安全的操作,下面展示使用ThreadLocal实现单例的bean线程安全的例子:

新建一个springBoot项目,创建一个过滤器,继承OncePerRequestFilter

@Component
public class MyFilter extends OncePerRequestFilter {
    @Autowired
    private Person person;

    //使用ThreadLocal对象,把单例的person对象set到ThreadLocal中
    public static ThreadLocal<Person> auth=new ThreadLocal<Person>();

    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        auth.set(person);

        doFilter(request,response,filterChain);
    }
}

Person类如下:

@Component
public class Person {
    public int age;
}

为了简单起见,我们person类只有一个属性,

写两个controler:

@GetMapping("/h1")
    public int hhh(){
        Person person = MyFilter.auth.get();
        person.age=111;
        return person.age;
    }

    @GetMapping("/h2")
    public int hhh1(){
        Person person = MyFilter.auth.get();
        person.age=112;
        return person.age;
    }

启动项目,分别发送这两个请求,可以验证。



版权声明:本文为weixin_52130337原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。