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 ...
随机推荐
- 【CoreBluetooth】iOS 系统蓝牙框架
https://www.jianshu.com/p/eb58dcbae5f9 2016.06.07 23:04* 字数 285 阅读 852评论 4喜欢 3 暂时 第一次功能性研究,具体实现,后续添加 ...
- Vacuum Pump Manufacturer - Vacuum Pump Range Use: Considerations
The vacuum pump is a versatile bottle that holds your lotion, shampoo and conditioner. Keep away fro ...
- idea 添加 阿里代码规范
参考: https://blog.csdn.net/weixin_39220472/article/details/80077803
- TensorFlow基础一(Symbolic Operation)
比较TensorFlow和Numpy 在Numpy中让两个随机矩阵相乘得到运算的结果: import numpy as np x = np.random.normal(size=[10, 10]) y ...
- ApacheDbUtilsTest
ApacheDbUtilsTest package p1; import com.DataSourceUtil; import entity.Student; import org.apache.co ...
- Codeforces Round #586 (Div. 1 + Div. 2)E(拓扑排序,思维)
#include<bits/stdc++.h>using namespace std;int n,m,s; vector<int>edge[200007];queue<i ...
- 企业面试问题收集-ssm框架
springMVC 1) 简单介绍下你对springMVC的理解? Spring MVC Framework有这样一些特点: 1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对 ...
- ardrino#串口控制led
void setup() { pinMode(D6, OUTPUT); digitalWrite(D6,HIGH); Serial.begin(); } void loop() { String st ...
- 113、Java中String类之字符串文本分割IP地址
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- vbs操作IE对象
Dim fso,filepath,i 'Dim ExcelBook,ExcelSheet,MyExcelBook,MyExcelSheet Dim ie Set ie=WScript.CreateOb ...