`

serverlet线程安全吗

 
阅读更多
本文属于转载:http://www.cnblogs.com/itTeacher/archive/2012/11/14/2769822.html

这个问题,在网上没有看到一个确切的答案,所以我们来分析一下:
首先什么是线程安全?
引用概念:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

那么我们都知道servlet是多线程的,同时一个servlet实现类只会有一个实例对象,也就是它是Singleton的,所以多个线程是可能会访问同一个servlet实例对象的。

每个线程都会为数据实例对象开辟单独的引用,那么servlet会是线程安全的吗?

要判断是否是线程安全,我们需要知道线程安全问题是由什么引起的。
搜索得到答案:线程安全问题都是由全局变量及静态变量引起的。
看到这个答案,突然想起很多年前调查过的一个bug, 那时我们系统中遗留的代码中写了很多全局变量,有一次发布后,客户反馈,当有多人同时进行某个操作时,我们的数据出了问题,那时我们调查后的结果就是:多人同步操作时,有些全局变量的值不对了,之后我们专门设一个人花了很多工夫来将所有全局变量都改成了局部变量了,并且项目要求以后不允许用全局变量。原来那时侯我就已经碰到过线程不安全的情况了啊,不过处理方式或者不用全局,或者加入同步,若加入同步同时也要考虑一下对程序效率会不会产生影响。

由此可知,servlet是否线程安全是由它的实现来决定的,如果它内部的属性或方法会被多个线程改变,它就是线程不安全的,反之,就是线程安全的。
在网上找到一个例子,如下:

public class TestServlet extends HttpServlet {
     private int count = 0;  
      
     @Override
     protected void service(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         response.getWriter().println("<HTML><BODY>");
         response.getWriter().println(this + " ==> ");
         response.getWriter().println(Thread.currentThread() + ": <br>"); 
         for(int i=0;i<5;i++){
             response.getWriter().println("count = " + count + "<BR>");
             try {
                 Thread.sleep(1000);  
                 count++;  
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
         response.getWriter().println("</BODY></HTML>");
     }
 }



当同时打开多个浏览器,输入http://localhost:8080/ServletTest/TestServlet时,他们显示的结果不同,这就说明了对于属性count来说,它是线程不安全的,
为了解决这个问题,将代码重构,如下:
public class TestServlet extends HttpServlet {
      private int count = 0;  
      private String synchronizeStr = ""; 
      @Override
     protected void service(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         response.getWriter().println("<HTML><BODY>");
         response.getWriter().println(this + " ==> ");
         response.getWriter().println(Thread.currentThread() + ": <br>"); 
         synchronized (synchronizeStr){
             for(int i=0;i<5;i++){
                 response.getWriter().println("count = " + count + "<BR>");
                 try {
                     Thread.sleep(1000);  
                     count++;  
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
             }
         }
         response.getWriter().println("</BODY></HTML>");
     }
 }
分享到:
评论

相关推荐

    jsp&serverlet api开发文档

    jsp&serverlet api开发文档

    Java_tomcat_和serverlet的使用

    Java_tomcat_和serverlet的使用

    jsp+serverlet+oracle

    《基于JSP+Servlet+Oracle的网上订餐系统解析》 ...总的来说,"jsp+serverlet+oracle"的组合提供了一个理想的实践平台,让初学者在实践中学习,在学习中实践,从而更好地理解和掌握Web开发的核心技术。

    java serverlet 小实例

    Java Servlet是一种Java编程技术,用于扩展Web服务器的功能。...在本小实例中,我们将深入探讨Java Servlet的基本概念、工作原理以及如何创建一个简单的Servlet。 Servlet是Java EE(企业级应用)的一部分,它不是独立...

    serverlet4Json

    serverlet Json commons-beanutils-1.7.0.jar commons-collections-3.2 .jar commons-lang-2.4.jar commons-logging.jar ezmorph-1.0.6.jar json-lib-2.2.3-jdk15.jar xmlns=...

    serverlet相关基础题

    如果希望Servlet支持多线程安全,则可以在JSP页面中设置`isThreadSafe`属性为`true`: ```xml ``` #### 7. 请求范围对象 - **Request**:代表单个HTTP请求的范围。每个请求都有一个单独的`HttpServletRequest`...

    基于javaweb+jsp+serverlet

    9. **安全性** 图书管理系统可能包含敏感信息,如用户账号和密码。因此,系统应采用安全措施,如加密传输(HTTPS)、防止SQL注入、XSS攻击等,确保数据安全。 10. **错误处理与日志记录** 为了调试和监控系统运行...

    javaWeb系列 serverlet最简单登陆代码

    随着技术的进步和安全需求的提升,实际应用中的登录功能会涉及更多复杂机制,如CSRF防护、XSS过滤、session管理等。因此,这个例子只是一个起点,实际开发中还需要不断学习和实践以掌握更全面的技能。

    Ajax与Serverlet原理及应用.zip

    你可以从“Ajax与Serverlet原理及应用”这个文件开始,逐步学习这两个技术的细节,包括它们如何协同工作以创建高效的Web应用程序。 总的来说,Ajax和Servlet的结合使用能够提供高性能、高度交互的Web界面,极大地...

    JSP serverlet 增删查改

    JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改

    java serverlet 实例

    Java Servlet是一种Java编程技术,用于扩展Web服务器的功能,使得服务器能够处理HTTP协议,进而构建动态、交互式的Web应用。Servlet是Java EE(企业版)的一部分,它为开发人员提供了处理客户端请求并返回响应的能力...

    jsp第2集视频关于serverlet

    这是我接着上次传的jsp视频,都是来子培训班的东西; 先传2集;有人下载了我传剩下的要不也没什么用

    JSP基于serverlet网上书店系统

    10. **数据库操作**:项目中可能涉及到SQL查询、事务处理、连接池等数据库操作技术,这些都是保证数据安全性和一致性的关键。 通过学习和实践这样的项目,开发者可以深入理解Java Web开发的核心技术和实际应用,...

    在线考试系统jsp+serverlet

    综上所述,"在线考试系统jsp+serverlet"是一个综合运用Java Web技术构建的教育信息化平台,它通过jsp提供友好的用户界面,借助servlet处理复杂的业务逻辑,从而实现教师、学生和管理员的各类功能需求。

    JSP和Serverlet之间的传值方法

    ### JSP与Servlet之间的传值方法详解 #### 一、引言 在Web开发中,JSP(JavaServer Pages)和Servlet是两个重要的技术组成部分,它们通常被用来处理客户端请求并生成动态网页内容。为了实现功能更为复杂的应用,...

    JSP Serverlet复习资料.pdf

    根据提供的文件信息,我们可以归纳和扩展出以下几个关键的知识点: ### 1....**GET 方法特点:** - GET 请求通常用于请求数据而不改变服务器状态的操作,例如浏览静态页面、查询商品信息等。 ... - GET 请求因为参数直接...

    JSP +SERVERLET+JAVABEAN

    **JSP(Java Server Pages)** 是一种动态网页技术,由Sun Microsystems开发,它允许开发者在...这个"模式JSP+Serverlet+JavaBean"的学习文件应该包含了相关的示例代码和教程,可以帮助你更好地理解和应用这些知识。

    Flex在myeclipse下如何配置以及用serverlet的交互

    这只是一个基础的框架,实际开发中还需要考虑错误处理、安全性、性能优化等多个方面。提供的文档如《如何学习flex.doc》、《MyEclipse下配置Flex.doc》、《整合Flex和Java--配置篇.pdf》和《Flex与Java Servlet交互...

    javabean+mysql+serverlet 学生成绩管理系统

    【标题】"javabean+mysql+serverlet 学生成绩管理系统"是一个基于J2EE技术栈构建的应用,主要用于管理教育机构的学生成绩。在这样的系统中,JavaBean是核心组件,它作为数据封装的载体,实现了业务逻辑;MySQL是常用...

    javaweb+javabean+serverlet

    javaweb期末课程设计,基于jsp+javabean+serverlet,是一个基于JSP、JavaBean和Servlet的JavaWeb应用程序。它旨在提供一个用户友好的界面,使用户能够完成投票。 技术实现: JSP:用于创建用户界面,包括展示投票...

Global site tag (gtag.js) - Google Analytics