对于那些会以多线程运行的单例类(比如spring mvc中的controller,dao,service)

局部变量不会受多线程影响
成员变量会受到多线程影响

如果方法里有成员变量,只有读操作,不受影响;存在写操作,考虑多线程影响值。

例如Web应用中的Servlet,每个方法中对局部变量的操作都是在线程自己独立的内存区域内完成的,所以是线程安全的。

而web中每个请求都是单独的线程,即使同时访问同一个Controller对象,因为并没有修改Controller对象,相当于针对Controller对象而言,只是读操作,没有写操作,因此不需要做同步处理。

Service层、Dao层用默认singleton就行。虽然Service类也有dao这样的属性,但dao这些类都是没有状态信息的,也就是 相当于不变(immutable)类,所以不影响。

这样spring mvc的速度当然比struts2要快,但是也无法使用全局变量。

那么,如果我们要使用全局变量,这里提供2种方式:

  第一种将controller的作用域由单例改为原型,在controller上加上注解:@Scope("prototype")

    这样每有一个请求访问,都会新建一个controller,缺点是速度会变慢。

  第二种是将controller的范围设置成会话级别(session),并加入一个初始化全局变量的方法,在方法上加上注解:@postContruct,它在bean初始化时执行。

    这样我们就会在每个请求来的时候,新建一个全局变量(例如下面例子中的list):

例:(参考:https://blog.csdn.net/weixin_33387378/article/details/87933743

@Controller
@Scope("session")
public class XxxController{
private List<String> list ;
//当bean加载完之后,就会执行init方法,并且将list实例化;
@PostConstruct
public void init(){
list = new ArrayList<String>();
}
}

spring mvc多个请求的影响 和使用全局变量的更多相关文章

  1. Spring MVC 异步处理请求,提高程序性能

    原文:http://blog.csdn.net/he90227/article/details/52262163 什么是异步模式 如何在Spring MVC中使用异步提高性能? 一个普通 Servle ...

  2. Spring MVC中forward请求转发2种方式(带参数)

    Spring MVC中forward请求转发2种方式(带参数) http://www.51gjie.com/javaweb/956.html  

  3. spring mvc 文件下载 get请求解决中文乱码问题

    方案简写,自己或有些基础的可以看懂,因为没时间写的那么详细 方案1 spring mvc解决get请求中文乱码问题, 在tamcat中server.xml文件 URIEncoding="UT ...

  4. Spring MVC的映射请求

    一.SpringMVC常用注解 @Controller 声明Action组件 @Service    声明Service组件    @Service("myMovieLister" ...

  5. Spring mvc 启动 和 请求分发

    Spring mvc 启动 和 请求分发 启动加载: abstract class HttpServletBean extends HttpServlet void init() initServle ...

  6. Spring MVC 处理一个请求的流程分析

    Spring MVC是Spring系列框架中使用频率最高的部分.不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分.因此程序员一定要熟练掌握MV ...

  7. Spring MVC 接受的请求参数

    目录 1. 概述 2. 详解 2.1 处理查询参数 2.2 处理路径参数接受输入 2.3 处理表单 3. 补充内容 3.1 Ajax/JSON 输入 3.2 multipart参数 3.3 接收 he ...

  8. spring mvc对异步请求的处理

    在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的. 1.修改web.xml <?xml version="1.0" enc ...

  9. spring mvc处理http请求报错:java.lang.IllegalStateException: getInputStream() has already been called for this request

    发送post请求到controller处理失败,报错日志如下: java.lang.IllegalStateException: getInputStream() has already been c ...

随机推荐

  1. 一个很有趣的示例Spring Boot项目,使用Giraphe CMS和Spring Boot

    6: 这是一个很有趣的示例Spring Boot项目,使用Giraphe CMS和Spring Boot. Giraphe是基于Spring Boot的CMS框架. https://github.co ...

  2. Nginx+Tomcat搭建高性能负载均衡集群

    一.       工具   nginx-1.8.0 apache-tomcat-6.0.33 二.    目标   实现高性能负载均衡的Tomcat集群: 三.    步骤   1.首先下载Nginx ...

  3. Matlab与C混编的介绍

    原本写给一个朋友的,帮助她入门matlab与C混编的 >#####环境: * Matlab:MATLAB R2013a * C编译器VC++2012 === #####配置环境: 在**Matl ...

  4. windows下使用 Secure Shell Client工具操作linux常用命令

    如果项目部署在linux系统上,而我们使用的是windows系统,那我们可以使用Secure Shell软件进行操作,那怎么使用它来操作tomcat呢? 1.  cd /usr/share/apach ...

  5. CSS简写总结

    CSS简写就是指将多行的CSS属性简写成一行,又称为CSS代码优化或CSS缩写.CSS 简写的最大好处就是能够显著减少CSS文件的大小,优化网站整体性能,更加容易阅读. 下面介绍常见的CSS简写规则: ...

  6. css布局-双飞翼布局

    <div class="header">Header</div> <div class="bd"> <div clas ...

  7. traceback模块

    traceback模块被用来跟踪异常返回信息 如下例所示: import traceback try: raise SyntaxError, "traceback test" ex ...

  8. status.go

    )))     return key }

  9. I/O-----二进制文件的读写

    好吧  已经被I/O刷屏了 这是复制文件 DataInputStream  dis =new DataInputStream(new FileInputStream("src/pcl.jpg ...

  10. statsd.go

        }     return arr[indexOfPerc] }