CSDNRGY 2017-12-10 06:34 采纳率: 87.5%
浏览 1584
已采纳

静态化service,dao,为什么不会引发线程安全问题

  • 写回答

9条回答 默认 最新

  • netlocks 2017-12-10 08:52
    关注

    和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。
    当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。
    如:
    [java] view plain copy
    public class Controller extends AbstractCommandController {

    ......

    protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,

    Object command,BindException errors) throws Exception {

    company = ................;

    }

    protected Company company;

    }

    在这里有声明一个变量company,这里就存在并发线程安全的问题。
    如果控制器是使用单例形式,且controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变量a,则,在别的请求中能够读到这个修改的内容。。

    有几种解决方法:
    1、在Controller中使用ThreadLocal变量
    2、在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller
    所在在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择
  • ¥15 这款软件是什么?需要能满足我的需求
  • ¥15 SpringSecurityOauth2登陆前后request不一致