java struts2学习笔记之线程安全
作者:醉眼识朦胧 发布时间:2022-08-07 00:13:07
标签:java,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;//定义一个公共的私有变量 name
public 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类没有任何区别,不会出现数据不同步的情况,因此是线程安全的。
以上就是本文的全部内容,希望对大家的学习有所帮助。


猜你喜欢
- 在Excel中,可对单元格中的字符串设置多种不同样式,通常只需要获取到单元格直接设置样式即可,该方法设置的样式会应用于该单元格中的所有字符。
- BufferedReader读取本地文件在使用BufferedWriter写入文件时,如果忘记关闭文件(close)同时也没有调用flush
- Android 界面刷新 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,
- 本文实例讲述了C#基于QRCode实现动态生成自定义二维码图片功能。分享给大家供大家参考,具体如下:二维码早就传遍大江南北了,总以为它是个神
- 1. 什么是Volley我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和
- 把idea中的项目导入github仓库中步骤详解做完项目进行云端保存是很必要的,我都是存放在github中。所以废活少说直接开始啦。前提是已
- Lucene从今天开始,我们要开始介绍Lucene中索引构建的流程。因为索引构建的逻辑涉及到的东西非常多,如果从构建入口IndexWrite
- 新建一个类继承AbstractFunction,重写以下方法:executesetParametersgetReferenceKeygetA
- 1.android 消息循环有4个重要的类Handler、Message、Looper、MessageQueuehandler 用来发送、处
- 本文主要是分析Spring bean的循环依赖,以及Spring的解决方式。 通过这种解决方式,我们可以应用在我们实际开发项目中。1. 什么
- 短网址(Short URL) ,顾名思义就是看起来很短的网址。自从twitter推出短网址服务以后,各大互联网公司都推出了自己的短网址服务。
- 桥接模式概述桥接模式(Bridge Pattern)也称为桥梁模式、接口(Interfce)模式或柄体(Handle and Body)模式
- java web 实现分页功能,分享给大家,具体如下:使用框架:ssm数据库:oracle话说 oracle 的分页查询比 mysql 复杂
- 运行本实例,将显示一个用户登录界面,输入用户名(hpuacm)和密码(1111)后,单击"登录"按钮,将弹出如下图所示的
- 对于学习过C语言的朋友应该都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存
- 前言TensorFlow是Google开源的一款人工智能学习系统。为什么叫这个名字呢?Tensor的意思是张量,代表N维数组;Flow的意思
- 本文实例为大家分享了android绘制曲线和折线图的具体代码,供大家参考,具体内容如下(曲线) (折线)1.CurveView.j
- 用法在java中经常会遇到需要对数据进行类型转换的场景,String类型的数据转为Int类型属于比较常见的场景,主要有两种转换方法:1. 使
- 今天看到一个ios写的图灵机器人,直接去官网(http://www.tuling123.com/openapi/)看了下API接入,太简单了
- 实践过程效果代码public partial class Form1 : Form{ public Form1()