zoukankan      html  css  js  c++  java
  • spring的controller是单例还是多例,怎么保证并发的安全

    controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。
    正因为单例所以不是线程安全的。

    @Controller
    public class ScopeTestController {
     
        private int num = 0;
     
        @RequestMapping("/testScope")
        public void testScope() {
            System.out.println(++num);
        }
     
        @RequestMapping("/testScope2")
        public void testScope2() {
            System.out.println(++num);
        }
     
    }
    

     

    1. 首先访问 http://localhost:8080/testScope,得到的答案是1; 单例是不安全的,会导致属性重复使用。
    2. 然后我们再访问 http://localhost:8080/testScope2,得到的答案是 2。 此时就不是我们想要的答案,num已经被修改。所有 request都访问同一个 Controller时,这里的私有变量就是共用的,也就是说某个 request中如果修改了这个变量,那么在别的请求中也可读到这个修改的内容。

    解决方案

    1. 不要在controller中定义成员变量。
    2. 万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式。(设置controller为多例模式 ,每次都创建新的controller;)在Controller中使用ThreadLocal变量 (
    3. 比如:private ThreadLocal<Integer> count = new ThreadLocal<Integer>();(注:ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。)另外,对集合的使用最好使用并发包里面的线程安全类。
      ————————————————
      版权声明:本文为CSDN博主「一粒小石子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      原文链接:https://blog.csdn.net/qq516071744/article/details/89005077

      )

    转自:

    https://blog.csdn.net/m0_37235955/article/details/105245989

    往事如烟,余生有我.
  • 相关阅读:
    on、where、having的区别(转载)
    Javascript 中的非空判断 undefined,null, NaN的区别
    SRM 223 Div II Level Two: BlackAndRed,O(N)复杂度
    ibatis通过Map封装参数调用存储过程
    NoSQL架构实践
    js实现密码强度验证
    ubuntu 10.04安装qtcreator并汉化
    2017第19周一
    越挫越战,越战越勇
    2017第18周六
  • 原文地址:https://www.cnblogs.com/assistants/p/14647968.html
Copyright © 2011-2022 走看看