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

action的线程安全问题

    博客分类:
  • J2EE
阅读更多
昨日去面试,问及struts方面的内容:aciton是否thread safe?
俺毫不犹豫的回答:yes,真是令人汗颜啊,简历上写着精通struts精通java这样的问题竟然都回答错误?
然后问:你是否在action里定义实例变量,俺回答:俺的action只充当转发功能 不定义实例变量,俺的回答是正确的,他港:俺知道其一不知道其二,可想而知 面试结果fail了
action到底是thread safe还是unsafe呢 我们来看看servlet是否是thread safe ,action都是继承至servlet的
看看其他资料的解释:
JSP默认是以多线程方式执行的,这是JSP与ASP,PHP,PERL等脚本语言不一样的地方,也是它的优势之一,但如果不注意多线程中的同步问题,会使所写的JSP程序有难以发现的错误。
JSP的中存在的多线程问题:

当客户端第一次请求某一个JSP文件时,服务端把该JSP编译成一个CLASS文件,并创建一个该类的实例,然后创建一个线程处理CLIENT端的请求。如果有多个客户端同时请求该JSP文件,则服务端会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间.对JSP中可能用的的变量说明如下:

实例变量
实例变量是在堆中分配的,并被属于该实例的所有线程共享,所以不是线程安全的.
JSP系统提供的8个类变量
JSP中用到的OUT,REQUEST,RESPONSE,SESSION,CONFIG,PAGE,PAGECONXT是线程安全的,APPLICATION在整个系统内被使用,所以不是线程安全的.
局部变量
局部变量在堆栈中分配,因为每个线程都有它自己的堆栈空间,所以是线程安全的.
静态类
静态类不用被实例化,就可直接使用,也不是线程安全的.
外部资源:
在程序中可能会有多个线程或进程同时操作同一个资源(如:多个线程或进程同时对一个文件进行写操作).此时也要注意同步问题.

使它以单线程方式执行,这时,仍然只有一个实例,所有客户端的请求以串行方 式执行。这样会降低系统的性能
最后的解决方案是:不要在action里用实例变量
分享到:
评论
8 楼 luckaway 2009-12-31  
action是否线程安全,取决你程序怎么写的!

struts2的action也可以写成单例的!!!
7 楼 小固体 2009-11-06  
struts 1 is thread safe , struts 2 is not.
6 楼 wuxi7227 2009-08-20  
现在不区分struts1和struts2,问这个问题者就是白痴了。
5 楼 longzhu007 2009-07-28  
winter8 写道
俺是菜鸟一只,请问一个实例是不是代表一个线程?

这个问法有问题的,一个实例是一种资源
4 楼 winter8 2009-07-28  
俺是菜鸟一只,请问一个实例是不是代表一个线程?
3 楼 C_J 2009-05-13  
S1的Action是Singleton模式,所以存在多线程问题,但S1绝对考虑到了如何处理request请求,不然也不会有这么多人用,但Action中不定义实例变量可能也是比较妥当的方法,感觉代码层次也比较清晰。
而S2的Action为每个request请求申请了实例,所以就不存在thread safe问题了。

对了  你说的中兴是什么呀?  我还在找工作呢~~郁闷!
2 楼 dvdface 2009-05-13  
看来我还是太谦虚, 只好去中兴了
1 楼 C_J 2009-04-28  
S1做了thread safe  but s2 have no thread safe~

相关推荐

    servlet与Struts action线程安全问题分析

    ### servlet与Struts action线程安全问题分析 #### 关键知识点概述 1. **Servlet的多线程机制**:Servlet的高效执行得益于其基于Java多线程机制的架构。Servlet容器在接收到客户端请求时,不会每次都创建新的...

    servlet与Struts action线程安全问题分析(pdf)

    ### servlet与Struts action线程安全问题分析 #### 一、引言 随着互联网应用的不断普及和发展,基于Servlet和JSP技术的应用程序在企业级应用中占据着重要的位置。Servlet作为一种常用的技术栈,因其多线程运行特性...

    Struts中action线程安全问题解析

    然而,使用Struts框架时,开发者需要注意一个关键的安全问题,那就是Action类的线程安全问题。这个问题主要源于Servlet容器(如Tomcat)对Servlet的处理方式。 首先,我们需要理解Servlet的生命周期。Servlet在Web...

    Action是否线程安全

    现在我们来详细讨论`Action`以及其线程安全性。 首先,让我们区分两种可能的`Action`类型: 1. **`java.util.concurrent.Action`**:这个接口在Java标准库中并不存在,可能是用户自定义的一个接口。如果它包含了...

    struts1,struts2,webwork,线程安全问题

    在Struts1中,每个`Action`类实例是被多个请求重用的,这使得它在多线程环境下存在潜在的线程安全问题。当多个线程同时访问一个`Action`实例时,可能会因为共享状态而导致数据不一致或其他并发问题。 - **Struts1中...

    C#线程安全和跨线程问题

    线程安全和跨线程问题是多线程编程中常见的挑战。VS2008(Visual Studio 2008)是开发这些应用的集成开发环境。在“C#线程安全和跨线程问题”这个主题中,我们将深入探讨如何处理这些复杂性。 线程安全是指一个类或...

    Struts线程安全

    因此,如果Action类中有实例变量,它们可能会被多个线程共享并同时访问,从而引发线程安全问题。 - **使用局部变量**:局部变量是线程安全的,因为它们是在方法调用时在栈上分配的,每个线程都有其独立的栈空间。这...

    Java框架面试题总结.pdf

    9. **Action线程安全问题**: - Struts1中的Action默认不是线程安全的,可能导致并发问题。 - 可通过实现`Singleton`模式,或者使用`ActionProxy`的`createAction`每次创建新的Action实例来解决。 10. **Tiles...

    UI界面多线程简单实现和线程捕获异常问题

    总之,UI界面多线程的实现需要考虑线程安全、UI更新和异常处理等问题。合理使用多线程和异步编程能显著提升应用程序的用户体验,但同时也需要开发者对并发编程有深入理解,以避免可能的并发问题和资源竞争。在编写...

    多线程 dataGridView问题

    此外,使用`Task`类进行异步操作时,可以配合`async/await`关键字简化代码,但同样需要注意线程安全问题。`await Task.Run(() => {...})`会在新的后台线程中执行代码块,之后需要确保UI更新操作回到主线程。 工厂...

    C#线程间操作无效Study

    在Windows Forms或WPF应用程序中,UI元素是线程安全的,只能由创建它们的线程进行修改。因此,当非UI线程尝试修改UI元素,如文本框、按钮等,就会抛出此异常。 解决“线程间操作无效”的方法主要有两种: 1. 使用`...

    Unity3D中的多线程及使用多线程1

    但是,使用多线程也带来了许多挑战,例如线程安全问题、数据同步问题等。在 Unity3D 中,需要特别注意线程安全问题,否则可能会出现错误和崩溃。 Unity3D 中的多线程可以使用 C# 的 lock 关键字来实现线程安全。...

    强大安全多线程的Flux模式

    在“强大,安全,多线程的Flux模式”中,我们将探讨如何在JavaScript开发环境中实现高效且安全的状态管理。 首先,Flux的核心概念是单向数据流。这意味着数据从服务器获取,经过Action Creator,然后通过Dispatcher...

    WPF后台线程更新UI

    - **线程安全问题**:由于.NET Framework的UI控件不支持多线程访问,后台线程直接修改UI会导致数据竞争和同步问题。 **2. Dispatcher的使用** - **Invoke方法**:后台线程可以通过调用`Dispatcher`的`Invoke`方法将...

    WinForm后台线程与UI线程通讯

    由于.NET Framework的安全机制,直接在非UI线程修改UI组件可能会导致线程不安全的问题,因此需要正确地进行线程间通信。本文将详细探讨如何在WinForm应用中实现在后台线程与UI线程之间的通信,并确保UI更新的安全。 ...

    C#多线程编程实例 线程与窗体交互源码

    标题中的"C#多线程编程实例 线程与窗体交互源码"意味着这个示例将展示如何在线程安全的环境下操作UI组件。在C#中,我们通常使用`Control.Invoke`或`Control.BeginInvoke`方法来解决这个问题。这些方法会在正确的线程...

    Cpp_Concurrency_In_Action(本书是基于C++11新标准的并发和多线程编程深度指南。),非扫描版

    书中会详细讲解如何创建和管理线程,包括std::thread的使用、线程的生命周期以及线程安全问题。此外,还会深入讨论如何通过互斥量(mutexes)和条件变量(condition variables)来实现线程间的同步,确保数据一致性...

    C#多线程控件安全调用示例

    然而,多线程环境下的控制台控件操作必须谨慎进行,因为不同线程间的交互可能导致数据不一致或者线程安全问题。本示例将深入探讨如何在C#中安全地在多线程环境中调用控件,以确保程序的稳定性和正确性。 首先,了解...

Global site tag (gtag.js) - Google Analytics