`
LucasLee
  • 浏览: 206229 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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的实例会被多个线程同时调用,而过了这一层,如果在你自己的代码中没有另外启动线程,且每次调用后续业务对象时都是先新建一个实例再调用,则都是线程安全的。
分享到:
评论
1 楼 galaxystar 2006-09-18  
java内存模型及多线程允许做到这点!
给类变量加以volatile关键字,可以保证多线程下的变量改变后,能被另一线程即时读到!
如果用1.5里的java.concurrent.atomic原子锁就更好了!

相关推荐

    多线程Web服务器的设计与实现

    5. **并发控制**:在多线程环境中,必须考虑线程安全问题,比如资源竞争和死锁。Java提供了一些并发工具类,如`synchronized`关键字、`ReentrantLock`、`Semaphore`等,用于管理和控制并发访问,确保数据一致性。 6...

    多线程web服务器+部分实验报告

    在IT领域,多线程Web服务器是实现高性能...这些内容对于学习和理解多线程Web服务器的工作原理和实际开发具有很高的价值。在完成这样的实验后,学生不仅掌握了多线程技术,还增强了对网络编程和服务器端架构设计的理解。

    编写简单的HTTP 1.0客户端/服务器程序:.编写多线程Web服务器:编写简单的RMI程序

    其次,多线程Web服务器的编写涉及并发处理和服务器性能优化。在高并发场景下,多线程技术使得服务器能同时处理多个请求,提高服务效率。在Java中,可以使用Thread类或Runnable接口来创建线程。服务器需要监听特定...

    计算机网络课程设计----多线程Web服务器

    完成这个课程设计,你不仅会深入理解Web服务器的工作原理,还能掌握多线程编程技巧,这对于未来从事服务器开发、网络编程等工作具有重要意义。在实际项目中,还需要考虑安全性、可扩展性、资源利用率等因素,这些都...

    基于多线程的web服务器java源码

    5. **同步与互斥**:在多线程环境下,数据共享可能导致竞态条件,因此需要使用synchronized关键字、Lock接口或原子变量来保证线程安全。 6. **日志记录**:为了便于调试和监控,服务器通常会有日志记录功能。Java的...

    linux下一个web服务器源代码(多线程)

    在Linux环境下,构建一个Web服务器是一项挑战性的任务,但也是一个极好的学习机会,特别是对于那些对网络编程感兴趣的开发者。这个“Linux下一个web服务器源代码(多线程)”提供了宝贵的资源,让你能够深入理解...

    PY版多线程webserver.rar

    多线程Web服务器虽然可以提高并发性能,但也需要注意线程安全问题。由于多个线程可能会访问同一资源,如果没有正确的同步机制,可能会出现竞态条件,导致数据不一致。Python提供了锁(Lock)、信号量(Semaphore)等...

    多线程Web服务器!QT做的!!

    " 表明这个服务器在实际使用中表现出色,易于操作,并且是使用QT库和Visual Studio(VS)这一集成开发环境(IDE)配合构建的。Visual Studio是一个强大的开发工具,尤其适合Windows平台上的C++开发,它的集成特性...

    C语言开发Linux下web服务器(支持GET/POST,SSL,目录显示等)

    在Linux环境下,C语言开发Web服务器需要对TCP/IP协议栈有深入理解。TCP是传输控制协议,负责建立可靠的数据传输连接;IP则是互联网协议,用于在网络中路由数据包。在C语言中,可以使用套接字(socket)API来实现这些...

    (linux下C语言实现)简易web服务器

    在Linux环境下,使用C语言编写一个简易的Web服务器是一项具有挑战性的任务,它涉及到网络编程、HTTP协议理解和操作系统层面的知识。下面将详细讲解这个项目所涵盖的关键知识点。 首先,我们来了解一下C语言在网络...

    计算机网络课程设计——《基于JAVA的多线程Web服务器》

    ### 计算机网络课程设计——《基于JAVA的多线程Web服务器》 #### 一、项目背景与目标 在本课程设计中,学生需要构建一个基于Java的多线程Web服务器,该服务器能够处理并发服务请求,并演示其能够向Web浏览器提供...

    Linux下基于多线程的服务器程序设计.pdf

    该方法可以广泛应用于服务器领域,例如,Web服务器、数据库服务器、文件服务器等。 此外,文章还讨论了多线程服务器程序设计的实现框架。该框架包括创建线程、线程的同步、线程的调度等几个方面。在实现多线程...

    WEBAPI多线程并发测试工具

    WEB API 多线程并发测试工具”重复了标题的信息,强调了该工具的核心功能,即为Web API提供多线程并发的测试环境,确保在高负载情况下的系统表现。 **API测试工具** API测试工具是用于验证API功能、性能和安全性...

    web服务器源代码

    - **多线程或多进程模型**: 为了处理并发请求,Web服务器可能使用多线程或多进程架构。 3. **VC6.0下的编译与调试**: 使用VC6.0编译Web服务器源代码,开发者需要配置项目设置,包括选择正确的编译器选项,链接库,...

    Java开发的简单WEB服务器源码Java实用源码整理learns

    标题中的“Java开发的简单WEB服务器源码Java实用源码整理learns”表明这是一个关于Java Web服务器开发的项目,可能是为了教学或者学习目的而编写的。这个项目可能包含了一个简单的HTTP服务器实现,允许用户理解Web...

    VC++实现基于MFC的Web服务器程序

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库在Visual C++ 6.0环境下实现一个简单的Web服务器程序。MFC是微软为C++开发人员提供的一套面向对象的类库,它封装了Windows API,使得Windows...

    Web服务器的开发

    VC++是一种强大的C++集成开发环境,常用于系统级和高性能应用程序的开发。在实现Web服务器时,可以利用其丰富的库函数和强大的性能来处理网络I/O操作。例如,你可以使用Winsock库来创建网络套接字,监听和接受来自...

    php_redis.dll for php5.3(包含线程安全和非线程安全两个版本)

    如果你的PHP运行环境是Apache(在Windows上通常使用FastCGI模式,是非线程的)或者Linux下的Nginx+PHP-FPM,那么非线程安全版本将是更合适的选择。 在提供的压缩包文件中,有两个对应的dll文件:`...

    WEB多线程开发

    在编写Servlet时,开发者需要注意线程安全问题,确保共享资源的正确访问。 3. **Struts**:Struts是一个基于MVC(Model-View-Controller)设计模式的Java EE框架,用于简化Web应用的开发。在Struts中,控制器组件...

    浅析Java Web开发环境的搭建.pdf

    Java Web开发环境的搭建是指在Java环境下进行Web应用程序的开发,包括安装开发工具包JDK、服务软件Tomcat和数据库,为了提高开发效率,通常还需要安装IDE(集成开发环境)工具,如Eclipse。 Java语言与平台无关、...

Global site tag (gtag.js) - Google Analytics