struts2学习笔记--线程安全问题小结
在说struts2的线程安全之前,先说一下,什么是线程安全?这是一个网友讲的,
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
就是说,在一个进程中有多个线程并发执行,每个线程执行过程中,变量值是相同的,执行结果也是相同的,就是线程安全的.否则就是线程不安全的.
然后回顾一下servlet的线程安全问题,由于servlet是单例模式的,只会产生一个实例,当多个用户同时请求一个servlet的时候,Tomcat会派生出多个线程来执行servlet的代码,因此servlet是线程不安全的,如果使用不当,可能会出现问题.下面贴一个例子:
package com.wang.servlet;import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class ThreadSafeServlet extends HttpServlet {private String name;//定义一个公共的私有变量 namepublic void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");//从request域中获取name属性name =request.getParameter("name");//使线程休眠10秒try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}//向浏览器输出name的值response.getWriter().print("name="+name);}}
我们在十秒内分别用两个浏览器访问ThreadSafeServlet?name="zhangSan"和ThreadSafeServlet?name="liSi",显示的结果均为name=liSi,这就意味着程序出现了问题,多线程并发的读写会导致数据不同步的问题,所以我们在使用servlet的时候尽量不要定义全局的私有属性,而是把变量分别定义到doGet()和doPost()方法中去,当然如果仅仅是读操作,是不会出现问题的,因此如果要在servlet中定义全局的只读属性最好定义为final类型.
Struts2中的Action为每个请求都创建一个实例,Action和普通的java类没有任何区别,不会出现数据不同步的情况,因此是线程安全的,
struts2学习笔记--线程安全问题小结相关推荐
- 多线程编程学习笔记——线程池(二)
接上文 多线程编程学习笔记--线程池(一) 三.线程池与并行度 此示例是学习如何应用线程池实现大量的操作,及与创建大量线程进行工作的区别. 1. 代码如下 using System; using Sy ...
- C++11学习笔记-----线程库std::thread
在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的<pthread.h>.但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++ ...
- Struts2学习笔记(九) 拦截器(Interceptor)(下)
拦截器的查找顺序 如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢: (1) 首先查找当前Action是否声明了拦截器,如果有则使用这个拦截器,不再继续寻找,如果没有,则执行下一 ...
- Struts2学习笔记总结
**技术分析之Struts2框架的概述** 1. 什么是Struts2的框架 * Struts2是Struts1的下一代产品,是在 struts1和WebWork的技术基础上进行了合并的全新的Stru ...
- 学习笔记 线程异步请求过程
记录学习线程异步请求的过程 版本1 不使用线程时,正常情况下执行过程. # -*- coding:utf-8 -*- # 日期:2018/5/27 14:50 # Author:小鼠标 import ...
- Struts2学习笔记(六):Struts2的处理流程与Action的管理方式
StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器,它负责拦截由<url-pattern>/*</url-pattern>指定的所有用 ...
- Struts2学习笔记(五)之异常处理机制
我们在知道在软件开发中的异常处理是很重要的,作为成熟的MVC框架的Struts2也提供了异常处理处理机制,对于一场处理:用户发送请求-->Action控制器-->发现相应的异常--> ...
- struts2学习笔记二--准备struts2的学习和开发环境
准备struts2的学习和开发环境 1 导包 2 参照开发包自带的例子在web.xml文件中配置 3 参照开发包自带的例子编写Action类和配置struts.xml文件 <struts> ...
- Struts2学习笔记(一)--入门常见配置
Struts2框架的学习路线 l 第一天:Struts2的概述.Struts2的入门.Struts2常见的配置.Struts2的Action的编写 l 第二天:Struts2的数据的封装.结果页面配 ...
最新文章
- spring 源代码地址
- mysql 5.7 延迟同步_MySQL5.6升级5.7时出现主从延迟问题排查过程
- Decompose Conditional(分解条件表达式)
- UUID 正在被 NanoID 取代?
- Spring:自动装配模式
- python 并发编程 多线程 守护线程
- [转]MySQL和SQLServer的比较
- 单片机花灯开关控制器C语言代码,以51单片机为核心的LED彩灯控制器设计
- 记录一次pre环境OOM异常解决过程
- 【2020年高被引学者】 朱松纯 北京大学
- linux电脑开机慢,Ubuntu 启动速度慢的解决方法
- jq 点击按钮跳转到微信_实现点击复制微信号并自动打开微信加好友
- 计算机地址怎么填写,电脑服务器名称或地址怎么填
- @Deprecated的使用
- 小论文中添加脚注(可以不显示标号)
- 用计算机代替人说话,人工智能是用计算机来模拟人的智能,代替人的部分脑力劳动...
- 智能优化算法:CEC23组常用测试函数公式介绍
- wp教程-wp详细教程-免费wordpress模板主题搭建教程
- GIS原理篇 terrain 基于TIN的表面数据(地形数据)
- 华盈IP PBX UC1910统一网关
热门文章
- 用jarsigner对android apk进行签名
- 如何配置IntelliJ IDEA发布JavaEE项目?
- 激动人心的AutoCAD .net开发技术
- HBase安装与命令行操作
- springboot 整合redis 实现KeySpaceNotification 键空间通知
- 12个常用的javascript简写技巧---可以大大减少js代码量
- SDN要防止七种认识偏差
- 填问卷赢280元SaaS峰会门票 与Salesforce、Zenefits现场交流!
- 工作5年才有自己博客...汗...
- 自定义堆栈(回文检测)