java struts2学习笔记之线程安全

 更新时间:2016年04月04日 15:04:46   作者:醉眼识朦胧  
这篇文章主要为大家详细介绍了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类没有任何区别,不会出现数据不同步的情况,因此是线程安全的。
以上就是本文的全部内容,希望对大家的学习有所帮助。

相关文章

  • MyBatis+Calcite实现多数据库SQL自动适配的详细指南

    MyBatis+Calcite实现多数据库SQL自动适配的详细指南

    在当今企业IT环境中,数据库异构性已成为常态,根据DB-Engines最新调研,超过78%的企业同时使用两种以上数据库系统,所以本文就来为大家介绍一下如何基于MyBatis+Calcite实现多数据库SQL自动适配吧
    2025-04-04
  • 关于knife4j的使用及配置

    关于knife4j的使用及配置

    这篇文章主要介绍了关于knife4j的使用及配置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • SpringBoot实现使用反射模拟IOC和getBean

    SpringBoot实现使用反射模拟IOC和getBean

    这篇文章主要介绍了SpringBoot实现使用反射模拟IOC和getBean,IOC就是spring的核心思想之一——控制反转。这里不再赘述,看此文章即可了解
    2023-04-04
  • IDEA中用maven连接数据库的教程

    IDEA中用maven连接数据库的教程

    这篇文章主要介绍了IDEA中用maven连接数据库的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • java算法实现红黑树完整代码示例

    java算法实现红黑树完整代码示例

    这篇文章主要介绍了java算法实现红黑树完整代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 浅谈SpringBoot资源初始化加载的几种方式

    浅谈SpringBoot资源初始化加载的几种方式

    在平时的业务模块开发过程中,难免会需要做一些全局的任务、缓存、线程等等的初始化工作,那么如何解决这个问题呢?本文就来介绍一下,感兴趣的可以了解一下
    2021-07-07
  • Java中的反射机制详解

    Java中的反射机制详解

    这篇文章主要介绍了JAVA 反射机制的相关知识,文中讲解的非常细致,代码帮助大家更好的理解学习,感兴趣的朋友可以了解下
    2021-09-09
  • idea企业开发之新建各类型项目的详细教程

    idea企业开发之新建各类型项目的详细教程

    这篇文章主要介绍了idea企业开发之新建各类型项目的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 论java如何通过反射获得方法真实参数名及扩展研究

    论java如何通过反射获得方法真实参数名及扩展研究

    这篇文章主要为大家介绍了java如何通过反射获得方法的真实参数名以及扩展研究,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步早日升职加薪
    2022-01-01
  • Java编程中随机数的生成方式总结

    Java编程中随机数的生成方式总结

    在Java中利用自带的类库可以有三种途径可以产生随机数,这里我们举了一些简单的例子来进行Java编程中随机数的生成方式总结,需要的朋友可以参考下
    2016-05-05

最新评论