欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java struts2学习笔记之线程安全

程序员文章站 2024-03-11 13:12:25
在说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类没有任何区别,不会出现数据不同步的情况,因此是线程安全的。
以上就是本文的全部内容,希望对大家的学习有所帮助。