Web服务器开发环境下的线程安全问题

原创 2006年06月09日 13:09:00

servlet是在多线程环境下的。即可能有多个请求发给一个servelt实例,每个请求是一个线程。
struts下的action也类似,同样在多线程环境下。可以参考struts user guide: http://struts.apache.org/struts-action/userGuide/building_controller.html 中的Action Class Design Guidelines一节:  Write code for a multi-threaded environment - Our controller servlet creates only one instance of your Action class, and uses this one instance to service all requests. Thus, you need to write thread-safe Action classes. Follow the same guidelines you would use to write thread-safe Servlets.
译:为多线程环境编写代码。我们的controller servlet指挥创建你的Action 类的一个实例,用此实例来服务所有的请求。因此,你必须编写线程安全的Action类。遵循与写线程安全的servlet同样的方针。
 
1.什么是线程安全的代码
  在多线程环境下能正确执行的代码就是线程安全的。
  安全的意思是能正确执行,否则后果是程序执行错误,可能出现各种异常情况。

2.如何编写线程安全的代码
  很多书籍里都详细讲解了如何这方面的问题,他们主要讲解的是如何同步线程对共享资源的使用的问题。主要是对synchronized关键字的各种用法,以及锁的概念。
  Java1.5中也提供了如读写锁这类的工具类。这些都需要较高的技巧,而且相对难于调试。
 
  但是,线程同步是不得以的方法,是比较复杂的,而且会带来性能的损失。等效的代码中,不需要同步在编写容易度和性能上会更好些。
  我这里强调的是什么代码是始终为线程安全的、是不需要同步的。如下:
  1)常量始终是线程安全的,因为只存在读操作。
  2)对构造器的访问(new 操作)是线程安全的,因为每次都新建一个实例,不会访问共享的资源。
  3)最重要的是:局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量。
    struts user guide里有:
    Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.
    译:只使用用局部变量。--编写线程安全的代码最重要的原则就是,在Action类中只使用局部变量,不使用实例变量。

 
总结:
    在Java的Web服务器环境下开发,要注意线程安全的问题。最简单的实现方式就是在Servlet和Struts Action里不要使用类变量、实例变量,但可以使用类常量和实例常量。
如果有这些变量,可以将它们转换为方法的参数传入,以消除它们。
    注意一个容易混淆的地方:被Servlet或Action调用的类中(如值对象、领域模型类)中是否可以安全的使用实例变量?如果你在每次方法调用时
新建一个对象,再调用它们的方法,则不存在同步问题---因为它们不是多个线程共享的资源,只有共享的资源才需要同步---而Servlet和Action的实例对于多个线程是共享的。
换句话说,Servlet和Action的实例会被多个线程同时调用,而过了这一层,如果在你自己的代码中没有另外启动线程,且每次调用后续业务对象时都是先新建一个实例再调用,则都是线程安全的。

Java多线程安全问题及解决方案

Java多线程安全问题及解决方案 一、问题引入 通过最常见的多窗口售票问题引入线程安全的问题。代码如下: 注:这里使用Runnable接口来实现线程,这样做是为了共享代售票这个资源,如果我们使用继承T...
  • OONullPointerAlex
  • OONullPointerAlex
  • 2016年03月16日 22:17
  • 1371

web开发常见安全问题

xss注入 概念XSS又叫CSS(Cross Site Script),跨站脚本攻击。指的是恶意攻击者往web页面里插入恶意脚本代码,而程序对于用户输入内容没有过滤,当用户浏览时,嵌入的脚本代码被执行...
  • atree1987
  • atree1987
  • 2017年04月18日 12:02
  • 333

Web服务器环境的搭建

理解网站和软件的分类       网站指:一个由若干html和css和js和img以及服务器端语言开发完成的软件   网站的分类:动态网站和静态网站   动态网站指:与数据库交互的网...
  • lmy_1
  • lmy_1
  • 2016年10月07日 18:59
  • 1524

Java Web并发访问的线程安全问题

一、Servlet的线程安全问题 Java web服务器下,每个Servlet只有一个实例(即单例模式),导致有多个Http请求发给一个Servlet实例,每个请求是一个线程。如果Servlet...
  • qq_33535433
  • qq_33535433
  • 2018年01月06日 23:09
  • 25

Java Web并发访问的线程安全问题

一、Servlet的线程安全问题Java web服务器下,每个Servlet只有一个实例(即单例模式),导致有多个Http请求发给一个Servlet实例,每个请求是一个线程。如果Servlet有类变量...
  • qq_34531925
  • qq_34531925
  • 2017年07月14日 07:22
  • 462

Web 开发常见安全问题

不是所有 Web 开发者都有安全的概念,甚至可能某些安全漏洞从来都没听说过。这就是这篇科普文章的存在意义,希望 Web 开发者在开发时能依此逐条检查代码中的安全问题。 注:服务器运维相关的安全注意事...
  • fengyinchao
  • fengyinchao
  • 2016年03月01日 19:46
  • 10542

线程安全问题及解决办法

一.什么时候会出现线程安全问题? 在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源: 一个变量、一个对象、一个文件、一个数据库表等...
  • gongpulin
  • gongpulin
  • 2016年04月21日 17:03
  • 1039

Java WEB项目安全问题及解决方案

1.弱口令漏洞 解决方案:最好使用至少6位的数字、字母及特殊字符组合作为密码。数据库不要存储明文密码,应存储MD5加密后的密文,由于目前普通的MD5加密已经可以被破解,最好可以多重MD5加密,或...
  • liangzi_lucky
  • liangzi_lucky
  • 2016年09月05日 16:43
  • 2479

《Python入门》Windows 7下Python Web开发环境搭建笔记

最近想尝试一下在IBM Bluemix上使用Python语言创建Web应用程序,所以需要在本地搭建Python Web的开发测试环境。关于Python的版本 进入Python的网站,鼠标移到导航条上的...
  • testcs_dn
  • testcs_dn
  • 2016年01月02日 11:24
  • 16017

Web站点常见安全问题

Web站点常见安全问题类型
  • tiankai30
  • tiankai30
  • 2017年02月06日 13:51
  • 379
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Web服务器开发环境下的线程安全问题
举报原因:
原因补充:

(最多只允许输入30个字)