springmvc线程安全问题
对于使用过SpringMVC和Struts2的人来说,大家都知道SpringMVC是基于方法的拦截,而Struts2是基于类的拦截。struct2为每一个请求都实例化一个action所以不存在线程安全问题,springmvc默认单例请求使用一个Controller,假如这个Controller中定义了静态变量,就会被多个线程共享。所以springmvc的controller不要定义静态变量。如果要使用可以用ThreadLocal或者@Scope("prototype")开启不以单例的模式运行但是以这种方式运行就不是单例了会有额外的开销。那么有人就会问了,spring管理的bean默认也是单例的,是不是说除了controller,我后面的service和dao是也要注意线程安全问题?这个问题就要具体问题具体回答了,这里对线程安全问题的产生做个简单的介绍也许你就会懂了。
我们都知道线程安全问题其实就是数据共享问题。如果多个线程之间共享了同一份数据就存在同时操作这个数据的可能。这个时候就会出现
和预期的偏差,这就是线程安全问题。
在谈这个问题之前我们需要知道java内存哪些是多线程共享的,那些是线程独有的。
Java平台中的内存包括以下几种:Stack空间、Heap空间和Non-Heap空间,stack是线程独享的,heap和non-heap是线程间共享的。
stack:栈,每个线程都有自己的栈,他主要用来存放局部变量的值即对象的引用。
heap:堆,所有的对象都是放到堆里面的,实例变量的值是存储在Heap空间的。实例变量是可以被多线程共享的。
non-heap:静态变量的值是存储在Non-Heap空间中的,也是线程间共享的。
有如下的类:
class A{
private int a=0;
private static int b=1;
public void method(){
int c=0;
boolean flag = true;
List<String> list=new LinkedList<String>();
}}
}
其中a是实例变量会被多个线程共享(A类如果是singleton的话)
b是静态变量(类变量)会被多个线程共享
c是局部变量用线程独享的stack存放
list存放指向堆上的对象的引用也是线程独享的
这里还实例化了一个LinkedList对象是放在heap上的这个是可以共享的,但是对例子上的这个对象来讲
method每次被调用都会生成一个LinkedList实例,因此list变量所引用的对象实际上只有一个线程可以访问。
到这里大家应该对使用单例还是多例有个明确的认识了吧。笼统的讲当模式是单例的时候,而类里面有静态变量和实例变量的时候要考虑线程安全问题了,这个时候的一些集合操作最好使用并发包java.util.concurrent里面的额相关集合类
springmvc线程安全问题的更多相关文章
- springmvc中request的线程安全问题
SpringMvc学习心得(四)springmvc中request的线程安全问题 标签: springspring mvc框架线程安全 2016-03-19 11:25 611人阅读 评论(1) 收藏 ...
- Servlet, Struts2和SpringMVC 并发访问线程安全问题
第一部分: Servlet不是线程安全的. 要解释Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的. 当Tomcat接收到Client的HTTP ...
- Spring MVC 线程安全问题的思考
Spring MVC 线程安全问题的思考 在读一些博文的时候发现有些文章对SpringMVC的Controller线程安全的验证并不正确,比如没有探究controller线程不安全的具体原因,比如将请 ...
- Spring中构造器、init-method、@PostConstruct、afterPropertiesSet孰先孰后,自动注入发生时间以及单例多例的区别、SSH线程安全问题
首先明白,spring的IOC功能需要是利用反射原理,反射获取类的无参构造方法创建对象,如果一个类没有无参的构造方法spring是不会创建对象的.在这里需要提醒一下,如果我们在class中没有显示的声 ...
- 被我们忽略的HttpSession线程安全问题
1. 背景 最近在读<Java concurrency in practice>(Java并发实战),其中1.4节提到了Java web的线程安全问题时有如下一段话: Servlets a ...
- Java多线程--线程安全问题的相关研究
在刚刚学线程的时候我们经常会碰到这么一个问题:模拟火车站售票窗口售票.代码如下: package cn.blogs.com.isole; /* 模拟火车站售票窗口售票,假设有50张余票 */ publ ...
- struts2学习笔记--线程安全问题小结
在说struts2的线程安全之前,先说一下,什么是线程安全?这是一个网友讲的, 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样 ...
- iOS中的线程安全问题
为了保证线程安全,不会因为多个线程访问造成资源抢夺,出现的运行结果的偏差问题,我们需要使用到线程同步技术,最常用的就是 @synchronized互斥锁(同步锁).NSLock.dispatch_se ...
- java 22 - 13 多线程之解决线程安全问题的实现方式2
上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ; Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...
随机推荐
- win10的guard占内存过高
转自:https://zhidao.baidu.com/question/1180883495203481459.html win10的guard占内存过高,
- SVM总结(参考源码ml.hpp)
如何使用,请查阅我的另一篇博客——SVM的使用 1.setType() SVM的类型,默认SVM::C_SVC.具体有C_SVC=100,NU_SVC=101,ONE_CLASS=102,EPS_SV ...
- Python中的进制表示方式及转换方法
在Python中,非十进制数字的表示方式为: 二进制:前面加0b,如0b1001 八进制:前面加0o,如0o3562 十六进制:前面加0x,如0x2af3 不同进制数字可直接进行数学计算,结果返回十进 ...
- VS Code 入门
将VSCode设置成中文语言环境 快捷键[Ctrl+Shift+P]—输入[Configure Display Language]—将“en”改为“zh-CN”—打开extention输入[Chine ...
- day22-Python运维开发基础(正则函数 / 异常处理)
1. 正则函数 # ### 正则表达式 => 正则函数 import re # search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "5*7 9 ...
- IIS URL Rewrite(URL 重写)-使用教程
IIS URL Rewrite(URL 重写)-使用教程 作者:vkvi 来源:千一网络(原创) 日期:2011-8-17 http://www.cftea.com/c/2011/08/9CRXOL ...
- Linux centos7 rsync工具介绍、rsync常用选项、rsync通过ssh同步
一.rsync工具介绍 rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync ...
- 收藏 40 2 CPD (广告合作方式)
CPD,Cost per day的缩写,意思是按天收费,是一种广告合作方式. 在实际的广告合作中根据行业不同还包括Cost per Download的缩写含义,意思是依据实际下载量收费. “CPD ...
- apply()、call()、bind()
在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向.apply和call方法.bind方法都是在特定的作用域中 ...
- Codeforces 1304B. Longest Palindrome
根据数据范围,暴力可以解决,对每一个串,找与其互为回文的串,或者判断自身是否为回文串,然后两两将互为回文的串排列在头尾,中间放且只能最多放一个自身为回文串的串,因为题目说每个串都是不同的 #inclu ...