Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > Web服务器开发环境下的线程安全问题
【标  题】:Web服务器开发环境下的线程安全问题
【关键字】:Web
【来  源】:http://blog.csdn.net/superbible_cs/archive/2006/06/09/782609.aspx

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

Your Ad Here

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的实例会被多个线程同时调用,而过了这一层,如果在你自己的代码中没有另外启动线程,且每次调用后续业务对象时都是先新建一个实例再调用,则都是线程安全的。

extremecomponents extremetable的导出时中文文件名为乱码的问题解决:【上一篇】
newxy技术零java代码实现数据分页显示 作者:胡立新:【下一篇】
【相关文章】
  • 用Eclipse3.1.2+EasyJWeb0.5建立WEB项目(第二回)-含视频演示
  • 对升级到WebWork2.2.2的牢骚
  • Atlas 调用web service
  • HowTo Use webframe Debugging Point
  • ★关于. Python 的 web framework 框架
  • limodou大虾评论基于python的web框架(经典)
  • FreeBSD4.10安装web服务器
  • CVSWEB-CVS的WEB界面
  • 完整的网站间共享数据的Web Service
  • Xml WebService完全实例解析(一)
  • 【随机文章】
  • Atlas 学习之005:在按钮上实现无刷新适时动态显示当前时间
  • Javascript实例教程(6) 在一个表单中设置和检查Cookies
  • 奇门遁甲算法分析
  • 如何安全彻底地卸下Windows NT
  • 优先队列示例: 哈夫曼编码
  • QQ聊天记录偷窥和QQ视频欺骗
  • [ASP.NET]如何灵活定制皮肤/页面:布局设计器介绍
  • ubuntu介绍
  • Windows2003服务器安全配置的一些思路(2)
  • 转贴:pb11系统转到.NET总结 www.kosney.cn
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.