关于javaWeb多线程看了一些资料,感觉这篇不错,转过来啦……
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多线程下载知识点。 1. **线程基础**:在Java中,线程是程序执行的最小单元,每个线程负责一部分任务。在多线程下载中,每个线程负责下载文件的一个部分。 2. **Thread类与Runnable...
该项目是个人大作业项目源码,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有...
javaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。本实例将探讨如何利用Java实现一个具有进度条显示功能的多线程应用。进度条通常用于可视化地表示某个任务的完成程度,这对于长...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。断点续传是文件传输中的一个实用功能,尤其在大文件上传或下载时,可以避免因网络中断或其他问题导致的传输失败。下面将详细...
在Java编程中,多线程下载大文件是一种常见的优化策略,尤其对于网络资源如文件或图片的下载。这种策略能够利用多核处理器的优势,通过并发处理来提高下载速度。本篇将详细介绍如何使用Java实现基于URL的单个大文件...
本教程将深入讲解Servlet生命周期、Servlet API的使用、Servlet配置以及Servlet的多线程处理。通过实践,你将学会创建和注册Servlet,实现动态网页功能。 三、IDEA集成开发环境 IntelliJ IDEA是许多Java开发者首选...
多线程断点式下载示例代码,再分享一个Java 多线程断点式下载模块,主要原理是: 把context分为poolSize段,计算每段的长度。如果文件已存在,根据临时文件中记载的线程数量,继续上次的任务,如果下载的目标文件不...
单线程有问题解决,没问题需要看是否线程直接竞争资源导致,即分析多线程问题 WEB Server确认: 服务CPU高并不一定一定是Server导致,也可能是其他辅助服务,需要根据top命令确认 单线程问题定位: 根据进程PID...
了解J2SE的基础,包括面向对象编程、集合框架、多线程、输入/输出流、网络编程等,是成为一名合格的JavaWeb开发者必不可少的一步。 2. **Struts框架** Struts是一个开源的MVC(Model-View-Controller)框架,广泛...
使用ThreadLocal可以避免在多线程环境中的同步问题,提高性能。 至于文件名"BookStoreUseMyBaseDao5",这可能是一个关于书店管理系统的示例,使用了自定义的基础DAO层(MyBaseDao),这里的"5"可能是版本号或者某种...
本文利用javaweb,连接了数据库,主要实现了五种置换算法、随机数生成、多线程启动和暂停、动画显示实现、柱状图生成、查看历史纪录、只显示最新一次结果等功能。 具体如下: 实现了五种置换算法,OPT、CLOCK、LFU、...
它支持面向对象编程、多线程、网络编程等功能,这使得Java非常适合用来开发复杂的Web应用程序。JavaWeb应用程序可以利用Java语言的特性来处理业务逻辑,并通过JSP(Java Server Pages)技术与HTML页面集成,实现动态...
此外,还有异常处理、集合框架(如ArrayList、LinkedList、HashMap等)、输入/输出流以及多线程等核心内容。 2. **微服务**:微服务架构是一种将大型应用拆分为一组小型、独立的服务的方法,每个服务都可以在其自身...
1. **Java语言基础**:Java是JavaWeb项目的核心编程语言,你需要熟悉其语法、面向对象特性、异常处理、多线程以及输入/输出流等基础知识。 2. **Servlet和JSP**:Servlet是JavaWeb应用中处理HTTP请求的服务器端组件...
首先,JavaSE_API_1_6_zh_CN.CHM是Java标准版API的中文版文档,它包含了Java语言的核心类库,如集合框架、IO流、网络编程、多线程等内容。学习JavaSE是理解JavaWeb的基础,开发者可以通过查阅这个文档了解如何编写和...
9. **多线程处理**: WebSocket连接建立后,服务器可能需要为每个连接创建单独的线程来处理消息收发,以保证服务的并发处理能力。 10. **前端技术**: 前端部分可能包含HTML、CSS和JavaScript,其中JavaScript库...
7. **Spring框架**:Spring是JavaWeb开发中最流行的框架,涵盖了依赖注入、AOP(面向切面编程)、MVC、数据访问、事务管理等多个方面。理解Spring的核心原理和使用方式,能够大大提高开发效率。 8. **Struts、...
这些API包括基本数据类型、异常处理、输入/输出流、网络编程、多线程、集合框架、反射、XML处理等核心功能。在JavaWeb开发中,以下是一些关键的Java API模块: 1. **集合框架**:`java.util`包下的ArrayList、...
1. **Java**:作为后端的主要编程语言,Java提供了强大的面向对象编程能力,支持多线程处理,确保了系统的稳定性和高效性。 2. **Servlet**:Java Web应用中的核心组件,用于处理HTTP请求并返回响应,是连接前端和...