SpringMVC学习笔记:单例与并发问题
Spring中的Bean默认都是单例(singleton),Spring中Bean的scope属性有五种类型:
- singleton 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例
- prototype 表示每次获得bean都会生成以新的对象
- request 表示在一次Htttp请求内有效(只适用于web应用)
- session 表示在一个用户会话内有效(只适用于web应用)
- globalSession 表示在全局会话内有效(只适用于web应用)
SpringMVC中Controller类默认Scope是单例,因而在Controller类中使用成员变量时需要注意并发的问题,举例说明:
@Controller
public class ExampleAction {
private int singletonInt=0;
@RequestMapping(value = "/test")
@ResponseBody
public String singleton(HttpServletRequest request, HttpServletResponse response) throws Exception {
String data=request.getParameter("data");
if(data!=null&&data.length()>0){
try{
int paramInt= Integer.parseInt(data);
singletonInt = singletonInt + paramInt;
}
catch(Exception ex){
singletonInt+=10;
}
}else{
singletonInt+=1000;
}
return String.valueOf(singletonInt);
}
}
请求三次 http://localhost:8080/test?data=15 ,得到的结果分别是15 30 45,由此说明Controller是单例
单例的好处也很明显:不用每次创建Controller,减少了对象创建和垃圾收集的时间。
当有多个用户同时请求一个服务时,容器会给每一个请求分配一个线程,各个线程是不会相互影响,举例如下:
@RequestMapping(value = "/sleepdata")
@ResponseBody
public String switcher(HttpServletRequest request, HttpServletResponse response) throws Exception {
String sleep = request.getParameter("sleep");
if (sleep.equals("on")) {
Thread.currentThread().sleep(100000);
return "sleep on";
} else {
return sleep;
}
}
分别发送两个请求,
第一个请求:http://localhost:8080/sleepdata?sleep=on
第二个请求:http://localhost:8080/sleepdata?sleep=test
验证结果:第一个请求发出去以后,本地服务器等待100s,然后返回结果”sleep on”,在本地服务器等待的者100s当中,发送第二个请求,直接返回结果”test”。说明之间的线程是不互相影响的
单例的状态改变:体现为该单例的成员属性值的修改
有状态对象(Stateful Bean):就是有成员变量的对象,可以保存数据,是非线程安全的
无状态对象(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的
Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,让它们也成为线程安全的状态
浏览器访问服务器时将会产生一个session,同时会产生多个线程来处理请求,代码示例如下:
@Controller
public class SlemController { @GetMapping("/slem")
public ResponseEntity<?> slem(HttpServletRequest request) { return ResponseEntity.ok("SESSIONID " + request.getSession().getId() + " THREAD " + Thread.currentThread().getName());
}
}
分别用Chrome和Firefox访问这个controller,可以得到如下结果:同一个浏览器sessionid都是相同,但是thread不同,由此可以验证SpringMVC的多线程,测试发现,一个session最多创建10个线程,有待查验。
内容来源网络,非原创,侵删
SpringMVC学习笔记:单例与并发问题的更多相关文章
- C++并发与多线程学习笔记--单例设计模式、共享数据分析
设计模式 共享数据分析 call_once 设计模式 开发程序中的一些特殊写法,这些写法和常规写法不一样,但是程序灵活,维护起来方便,别人接管起来,阅读代码的时候都会很痛苦.用设计模式理念写出来的代码 ...
- Java学习笔记——单例设计模式Singleton
单例设计模式:singleton 解决的问题: 确保程序在运行过程中,某个类的实例instance只有一份. 特点: 1 构造函数私有化 2 自己内部声明自己 3 提供一个public方法,负责实例化 ...
- SpringMVC:学习笔记(5)——数据绑定及表单标签
SpringMVC——数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...
- 史上最全的SpringMVC学习笔记
SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...
- springmvc学习笔记(简介及使用)
springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...
- springmvc学习笔记---面向移动端支持REST API
前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...
- SpringMVC:学习笔记(8)——文件上传
SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...
- springmvc学习笔记(常用注解)
springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...
- SpringMVC学习笔记之二(SpringMVC高级参数绑定)
一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...
- springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定
springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 标签: springmvc springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需 ...
随机推荐
- mongodb-参考其他
MongoDB教程 http://www.runoob.com/mongodb/mongodb-window-install.html
- 第十章 优先级队列 (c)堆排序
- [leetcode]101. Symmetric Tree对称树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- [leetcode]449. Serialize and Deserialize BST序列化反序列化二叉搜索树(尽量紧凑)
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- ln: operation not permitted
ln: operation not permitted 在挂载的磁盘上建立软链接提示没有操作权限 例如: ln -s aa bb1ln:aa operation not permitted------ ...
- php使用pthreads v3多线程的抓取新浪新闻信息
我们使用pthreads,来写一个多线程的抓取页面小程序,把结果存到数据库里. 数据表结构如下: CREATE TABLE `tb_sina` ( `id` int(11) unsigned NOT ...
- docker-ce-17.09 数据卷和数据卷容器
docker容器中管理数据两种方式:1.数据卷(Data Volumes)2.数据卷容器(Data Volume Dontainers) 一.数据卷特性:1.数据卷可以在容器之间共享和重用2.对数据卷 ...
- JFinal Web开发学习(九)后台添加前台显示博客
效果: 发博客: 显示博客: 后台:使用hui-admin,文章编辑器是百度开源的ueditor 前台:使用layui前端框架 1.写控制器BlogController controller包中 pa ...
- maven构建ssh工程
1.1 需求 在web工程的基础上实现ssh工程的创建,规范依赖管理. 1.2 数据库环境 使用之前学习hibernate创建的数据库: 1.3 创建父工程 选择创建Maven Project ...
- jqPaginator分页(每次只取一页数据)
应用技术点:jqPaginator.template7.bootstrap.css 参考网址: jqPaginator:http://jqpaginator.keenwon.com/#a3 templ ...