`
字符串
  • 浏览: 36403 次
文章分类
社区版块
存档分类
最新评论

web开发中的线程安全

阅读更多

在web开发中,要关注由于并发访问所导致的对某一同一个值的修改,否则信息会造成泄漏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的实例会被多个线程同时调用,而过了这一层,如果在你自己的代码中没有另外启动线程,且每次调用后续业务对象时都是先新建一个实例再调用,则都是线程安全的。

分享到:
评论

相关推荐

    开发线程安全的SpringWeb应用-pdf清晰

    教你怎么开发线程安全的SpringWeb应用.

    Java Web开发常见问题.docx

    线程安全问题:在多线程环境下,Java Web应用程序可能会出现线程安全问题,例如竞态条件或死锁等。这通常是由于应用程序中的共享资源或同步问题导致的。 文件上传问题:在Java Web应用程序中,文件上传是一个常见的...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    第11章 开发线程安全的servlet 350 11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    第11章 开发线程安全的servlet 350 11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    第11章 开发线程安全的servlet 350 11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 ...

    C#线程锁介绍源码

    实际上在web开发中大多数逻辑都是在单个线程中展开的,一个请求都会在一个单独的线程中处理,其中的大部分变量都是属于这个线程的,根本没有必要考虑锁 定,当然对于ASP.NET中的Application对象中的数据,我们就要...

    Java线程:线程安全与不安全

    作为一个Java web开发人员,很少也不需要去处理线程,因为服务器已经帮我们处理好了。记得大一刚学Java的时候,老师带着我们做了一个局域网聊天室,用到了AWT、Socket、多线程、I/O,编写的客户端和服务器,当时做...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    第11章 开发线程安全的servlet 350 11.1 多线程的servlet模型 350 11.2 线程安全的servlet 351 11.2.1 变量的线程安全 351 11.2.2 属性的线程安全 360 11.3 singlethreadmodel接口 362 11.4 小结 363 11.5 ...

    web-client-server:简单 HTTP Web 客户端和多线程 Web 服务器的 Java 实现

    网络客户端服务器 简单 HTTP Web 客户端和多线程 Web 服务器的... WebServer.java :实现多线程服务器并初始化 serverSocket 以侦听客户端请求。 一旦连接了客户端,处理就会移交给单独的 RequestHandler 线程。 Reque

    C#(Csharp)多线程HTTP并发请求(HttpWebRequest)采集蜘蛛

    C#(也称Csharp)在多线程下并发执行HTTP请求的实现,采用C#封装HttpWebRequest类开发的多线程并发采集程序源码文档,文档中详细说明了HttpWebRequest并发HTTP请求实现网站采集的方法,经过测试同时并发1000+不是问题...

    Appweb嵌入式HTTP Web服务器

    它迅速( 每秒处理3500多要求)而紧凑 ,其中包括支持动态网页制作,服务器端嵌入式脚本过程中的CGI ,可加载模块的SSL ,摘要式身份验证,虚拟主机, Apache样式配置,日志记录,单和多线程应用程序。它提供了大量...

    [完整][中文][WEB安全测试].(美)霍普.扫描版.pdf

    本书中的秘诀演示了开发和测试人员在进行单元测试、回归测试或探索性测试的同时,如何去检查最常见的Web安全问题。与即兴的安全评估不同的是,这些秘诀是可重复的、简洁的、系统的——可以完美地集成到你的常规测试...

    基于epoll的包含线程池、定时器、日志的多进程多线程的WebServer服务器源码.zip

    基于epoll的包含线程池、定时器、日志的多进程多线程的WebServer服务器源码.zip基于epoll的包含线程池、定时器、日志的多进程多线程的WebServer服务器源码.zip基于epoll的包含线程池、定时器、日志的多进程多线程的...

    权威.NET多线程详解(源码示例)

    • 业务逻辑对事务和线程安全的要求 • 计算一下冲突的可能性 • 请多使用lock,少用Mutex Web和IIS • 应用程序池,WebApplication,和线程池之间有什么关系 • Web页面怎么调用异步WebService

    JAVA多线程与线程安全实践-基于Http协议的断点续传.zip

    这个项目是一个基于Java语言开发的Web应用程序,采用SSM(Spring+SpringMVC+MyBatis)或SSH(Spring+SpringMVC+Hibernate)框架进行开发,使用MySQL作为数据存储,JSP作为页面开发。 项目的目标是构建一个高效、可靠...

    .net 线程详解 基础篇

    * 业务逻辑对事务和线程安全的要求 * 计算一下冲突的可能性 * 请多使用lock,少用Mutex Web和IIS * 应用程序池,WebApplication,和线程池之间有什么关系 * Web页面怎么调用异步WebService

    基于Java实现多线程与线程安全实践-基于Http协议的断点续传源码

    Java是一种面向对象的编程语言,它具有安全、可靠、简单、高效、跨平台等特点,被广泛应用于各种类型的应用程序开发。Java程序由Java源代码编写,经过编译后生成Java字节码文件,然后在Java虚拟机上运行。 Java程序...

    C#范例开发大全源码

    内容涉及窗体设置、控件的应用、组件的应用、文件操作、图形图像、多媒体技术、系统操作、注册表编辑、数据库基础、报表与打印技术、正则表达式、多线程编程技术、局域网开发技术、C# 3.0新增功能、数据库高级技术、...

    网站安全漏洞检测工具Acunetix Web Vulnerability Scanner 6.5英文版

    是一个英文版的网络安全扫描工具,Web开发人员可以利用这个软件来检测自己开发的漏洞,英文不好的开发人员请从网站搜索它的相关操作文档,它具有以下功能: ◆AcuSensor 技术 ◆自动的客户端脚本分析器,允许对 Ajax...

Global site tag (gtag.js) - Google Analytics