在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的实例会被多个线程同时调用,而过了这一层,如果在你自己的代码中没有另外启动线程,且每次调用后续业务对象时都是先新建一个实例再调用,则都是线程安全的。
相关推荐
描述中的“WEB API 多线程并发测试工具; WEB API 多线程并发测试工具”重复了标题的信息,强调了该工具的核心功能,即为Web API提供多线程并发的测试环境,确保在高负载情况下的系统表现。 **API测试工具** API...
教你怎么开发线程安全的SpringWeb应用.
Servlet和Struts Action是两种常见的Java Web开发组件,它们在多线程环境下运行时可能存在线程安全问题。线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 ...
本文将深入讨论`php_redis.dll`在PHP 5.3版本中的应用,特别是其线程安全和非线程安全两个版本的差异。 首先,`php_redis.dll`是PHP与Redis交互的关键组件,它允许PHP脚本直接调用Redis命令,实现数据的存取。对于...
本主题“WEB多线程开发”聚焦于如何在Web环境中利用Java进行多线程编程。 Java EE,也称为Java 2 Platform, Enterprise Edition,是一个用于构建企业级应用的平台,它包括一系列标准组件和服务,如JSP(JavaServer ...
在C#编程环境中,VS2013是一个广泛使用的开发工具,主要用于构建Windows应用程序,包括桌面应用和Web应用。在处理串口通信时,线程安全是一个关键的概念,特别是当程序需要同时处理多个任务或者从外部设备(如串口)...
在实现这样一个多线程Web服务器时,开发者需要考虑线程安全、资源管理、错误处理等多个方面。例如,要防止多个线程同时访问同一资源导致的数据竞争,可能需要使用锁或者其他同步机制。此外,还需要处理异常情况,如...
- 考虑线程安全,避免在多线程环境中出现数据竞争问题。 - 对于Web应用,注意不要在定时任务中进行任何可能阻塞I/O的操作,以免影响其他请求的处理。 通过理解并有效利用多线程定时器,开发者可以构建出更加高效...
Python是一种广泛使用的编程语言,尤其在Web开发领域中,它以其简洁的语法和强大的功能而备受青睐。在本主题中,我们关注的是一个基于Python实现的多线程Web服务器。"PY版多线程webserver.rar"是一个压缩包,包含了...
综上所述,《Tomcat与Java Web开发技术详解》这本书不仅全面覆盖了Tomcat的基本使用方法,还深入探讨了Java Web开发中的高级技术,对于希望深入了解Tomcat及其在Java Web开发中应用的读者来说,是一本非常有价值的...
5. **并发控制**:在多线程环境中,必须考虑线程安全问题,比如资源竞争和死锁。Java提供了一些并发工具类,如`synchronized`关键字、`ReentrantLock`、`Semaphore`等,用于管理和控制并发访问,确保数据一致性。 6...
在标题和描述中,我们看到`PHP swoole loader`针对的是Linux和Windows系统,并且涵盖了线程安全和非线程安全两种模式,同时兼容PHP54到PHP81的多个版本。这意味着无论你是在哪种操作系统环境下,或使用哪个PHP版本,...
这本书可能会介绍在Web开发中常用的设计模式,比如工厂模式、单例模式、观察者模式等。 10. 开发工具和环境:为了提高开发效率,书中可能还会介绍一些常用的Java开发工具和环境配置,包括IDE(集成开发环境)如...
使用原子操作、线程局部存储、不可变对象等方式增强线程安全性。 四、源代码分析 压缩包中的`MultiThreadA`可能是包含一系列多线程编程实例的文件,如简单的线程创建、线程同步实验、死锁避免、线程通信等。通过对...
线程安全是多线程编程中的一个关键概念,意味着在多线程环境下,该扩展可以在不引入竞态条件或数据不一致性的情况下正确运行。PHP的线程安全特性对于那些在高并发服务器环境中运行的应用尤其重要,因为它确保了不同...
在Java Web开发中,Servlet是核心组件之一,用于处理HTTP请求和响应。多线程是现代计算机编程中的重要概念,特别是在服务器端应用中,如Web应用程序。本篇将深入探讨Servlet与多线程的关系,以及如何在Java Web环境...
总之,多线程Web服务器在Java中实现的核心在于合理调度线程,高效处理并发请求,并确保线程安全。通过线程池、并发控制机制以及高效的I/O模型,我们可以构建出能应对高并发场景的Web服务器。在实际项目中,还应考虑...
本文主要探讨了在Java平台上如何开发和使用多线程,特别是在Web应用程序中的实践。 首先,Java语言提供了内置的支持多线程的能力,允许开发者创建并发执行的任务。一个Java类可以通过实现`Runnable`接口或继承`...
通过学习和分析这些源码,开发者可以加深对Java编程、数据库操作和Web开发流程的理解,同时也能掌握实际项目中的最佳实践。 总之,这个压缩包提供了全面学习Java开发、数据库管理和Web应用程序构建的资源。无论是...
6. **跨平台兼容性**:虽然这里主要提及的是IE环境,但现代Web开发常常需要考虑到其他浏览器,如Chrome、Firefox等。因此,理解如何实现跨浏览器兼容性也是必要的。 通过学习和实践这些知识点,开发者可以构建出与...