在说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. 多线程编程学习笔记——线程池(二)

    接上文 多线程编程学习笔记--线程池(一) 三.线程池与并行度 此示例是学习如何应用线程池实现大量的操作,及与创建大量线程进行工作的区别. 1. 代码如下 using System; using Sy ...

  2. C++11学习笔记-----线程库std::thread

    在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的<pthread.h>.但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++ ...

  3. Struts2学习笔记(九) 拦截器(Interceptor)(下)

    拦截器的查找顺序 如果我们在多个地方配置了拦截器,那么框架会按什么样的顺序进行查找呢: (1)   首先查找当前Action是否声明了拦截器,如果有则使用这个拦截器,不再继续寻找,如果没有,则执行下一 ...

  4. Struts2学习笔记总结

    **技术分析之Struts2框架的概述** 1. 什么是Struts2的框架 * Struts2是Struts1的下一代产品,是在 struts1和WebWork的技术基础上进行了合并的全新的Stru ...

  5. 学习笔记 线程异步请求过程

    记录学习线程异步请求的过程 版本1 不使用线程时,正常情况下执行过程. # -*- coding:utf-8 -*- # 日期:2018/5/27 14:50 # Author:小鼠标 import ...

  6. Struts2学习笔记(六):Struts2的处理流程与Action的管理方式

    StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器,它负责拦截由<url-pattern>/*</url-pattern>指定的所有用 ...

  7. Struts2学习笔记(五)之异常处理机制

    我们在知道在软件开发中的异常处理是很重要的,作为成熟的MVC框架的Struts2也提供了异常处理处理机制,对于一场处理:用户发送请求-->Action控制器-->发现相应的异常--> ...

  8. struts2学习笔记二--准备struts2的学习和开发环境

    准备struts2的学习和开发环境 1 导包 2 参照开发包自带的例子在web.xml文件中配置 3 参照开发包自带的例子编写Action类和配置struts.xml文件 <struts> ...

  9. Struts2学习笔记(一)--入门常见配置

     Struts2框架的学习路线 l 第一天:Struts2的概述.Struts2的入门.Struts2常见的配置.Struts2的Action的编写 l 第二天:Struts2的数据的封装.结果页面配 ...

最新文章

  1. spring 源代码地址
  2. mysql 5.7 延迟同步_MySQL5.6升级5.7时出现主从延迟问题排查过程
  3. Decompose Conditional(分解条件表达式)
  4. UUID 正在被 NanoID 取代?
  5. Spring:自动装配模式
  6. python 并发编程 多线程 守护线程
  7. [转]MySQL和SQLServer的比较
  8. 单片机花灯开关控制器C语言代码,以51单片机为核心的LED彩灯控制器设计
  9. 记录一次pre环境OOM异常解决过程
  10. 【2020年高被引学者】 朱松纯 北京大学
  11. linux电脑开机慢,Ubuntu 启动速度慢的解决方法
  12. jq 点击按钮跳转到微信_实现点击复制微信号并自动打开微信加好友
  13. 计算机地址怎么填写,电脑服务器名称或地址怎么填
  14. @Deprecated的使用
  15. 小论文中添加脚注(可以不显示标号)
  16. 用计算机代替人说话,人工智能是用计算机来模拟人的智能,代替人的部分脑力劳动...
  17. 智能优化算法:CEC23组常用测试函数公式介绍
  18. wp教程-wp详细教程-免费wordpress模板主题搭建教程
  19. GIS原理篇 terrain 基于TIN的表面数据(地形数据)
  20. 华盈IP PBX UC1910统一网关

热门文章

  1. 用jarsigner对android apk进行签名
  2. 如何配置IntelliJ IDEA发布JavaEE项目?
  3. 激动人心的AutoCAD .net开发技术
  4. HBase安装与命令行操作
  5. springboot 整合redis 实现KeySpaceNotification 键空间通知
  6. 12个常用的javascript简写技巧---可以大大减少js代码量
  7. SDN要防止七种认识偏差
  8. 填问卷赢280元SaaS峰会门票 与Salesforce、Zenefits现场交流!
  9. 工作5年才有自己博客...汗...
  10. 自定义堆栈(回文检测)