我明白Struts2 Action类是线程安全的,因为这些操作被放在Value Stack中.值堆栈反过来是Action Context的一部分.由于Action Context是线程本地的,所以存储在Action Context(包括值堆栈)中的值在每个线程中是唯一的.所以,操作是线程安全的.

但是考虑拦截器:他们真的很有用,他们为程序员做所有这些乏味的小工作,像验证,获取参数值等.但是要考虑的是:拦截器可以在多个请求之间共享.那么这样做会使拦截器的线程不安全吗?

考虑到这个问题,我试图在网上浏览一些与这个问题有关的好文章.我发现一篇很好的文章,他们已经清楚地提到了一个例子,如何拦截器不是线程安全的.

网页是:http://www.bullraider.com/java/struts2/tutorials/interceptors-and-thread-safety

我从本文中得知,拦截器线程不安全的主要原因是拦截器只创建一次.即每个拦截器只有一个对象.因此,当线程之间共享相同的Interceptor实例时,实例字段不安全.

在文章的最后,有人提到有些情况下,即使拦截器是线程安全的.但他们没有提到任何这种情况.我冲浪网找到答案…但是徒然

任何人都可以告诉我或提供一个链接,在哪里可以找到如何使拦截器线程安全(或拦截器是线程安全的情况)?

解决方法

任何不使用实例字段或其他共享状态的Interceptor都是线程安全的:

例如,查看解析HTTP请求参数和cookie,执行日志记录,访问检查,异常处理的all the built-in interceptors:它们不使用实例字段进行可变状态(*),但只对作为参数的ActionInvocation实例进行操作.

(*)有些确实有配置参数的实例字段,这些参数在Struts启动时(在单个线程中)设置,如ExceptionMappingInterceptor或线程安全的实例字段,如LoggingInterceptor中的Logger.

如果您计划编写自己的Interceptor,只需使用您在intercept()方法中传入的ActionInvocation参数和局部变量即可.避免使你的截取方法同步或将事情放入同步的{}块的诱惑 – 这将创建一个使用Struts的单实例方法拦截拦截器的瓶颈.

从评论中回答问题:

(1) How come creating an instance of action for every thread doesn’t affect the performance?or does it?

使用现代JVM,创建对象的成本可以忽略不计.如果您通过避免昂贵的初始化来保持动作轻巧,那么对性能没有明显的影响,例如通过不在操作中创建数据库连接,但使用连接池.

(2) Do u recommend NEVER to use the default interceptor stack,and always use custom interceptor stack (where all the unused interceptors which use instance variables are removed) so that it will be thread safe?

我不认为任何出货和配置Struts 2的默认拦截器不是线程安全的;即使他们使用实例字段(因为它们仅用于配置或本身线程安全,如Logger).

根据我的个人经验,如果你有一个很好的理由(内置拦截器的线程安全性不是一个),你应该只能触摸/更改拦截器堆栈.如果您更改堆栈 – 运行其中一个内置堆栈(如“default”或“paramPrepareParam”),很多事情会以意想不到的方式运行/中断,从长远来看可以节省很多挫折.添加自己的自定义拦截器通常比从现有堆栈中删除/重新排列拦截器的破坏性更小.

java – Struts2中的拦截器线程是否安全?的更多相关文章

  1. iOS:核心图像和多线程应用程序

    我试图以最有效的方式运行一些核心图像过滤器.试图避免内存警告和崩溃,这是我在渲染大图像时得到的.我正在看Apple的核心图像编程指南.关于多线程,它说:“每个线程必须创建自己的CIFilter对象.否则,你的应用程序可能会出现意外行为.”这是什么意思?我实际上是试图在后台线程上运行我的过滤器,所以我可以在主线程上运行HUD(见下文).这在coreImage的上下文中是否有意义?

  2. xcode – 如何在LLDB断点条件下使用堆栈内容?

    问题:我有一种情况,我们在发布期间有媒体播放,并且objc_exception_throw()在此期间大约有5次点击,但总是被捕获,并且它在媒体播放器对象的南边.我厌倦了(a)必须手动连续n次,或者(b)在播放完成之前必须禁用断点.我尝试过的:>使断点忽略前五次命中(问题:它并不总是正好五次)>使用我的目标作为模块创建我自己的符号断点(问题:没有改变)我想做什么:想到的一个解决方案是在断点命中时评

  3. ios – 多个NSPersistentStoreCoordinator实例可以连接到同一个底层SQLite持久性存储吗?

    我读过的关于在多个线程上使用CoreData的所有内容都讨论了使用共享单个NSPersistentStoreCoordinator的多个NSManagedobjectContext实例.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用CoreData来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.问题是NSPersistentStoreCoordinator会对基础

  4. ios – XCode断点应该只挂起当前线程

    我需要调试多线程错误.因此,为了获得生成崩溃的条件,我需要在代码中的特定点停止一个线程,并等待另一个线程到达第二个断点.我现在遇到的问题是,如果一个线程遇到断点,则所有其他线程都被挂起.有没有办法只停止一个线程,让其他线程运行,直到它们到达第二个断点?)其他更有趣的选择:当你点击第一个断点时,你可以进入控制台并写入这应该在该断点处暂停当前上下文中的线程一小时.然后在Xcode中恢复执行.

  5. ios – 在后台线程中写入Realm后,主线程看不到更新的数据

    >清除数据库.>进行API调用以获取新数据.>将从API检索到的数据写入后台线程中的数据库中.>从主线程上的数据库中读取数据并渲染UI.在步骤4中,数据应该是最新数据,但我们没有看到任何数据.解决方法具有runloops的线程上的Realm实例,例如主线程,updatetothelatestversionofthedataintheRealmfile,因为通知被发布到其线程的runloop.在后台

  6. ios – 如何在Xcode堆栈跟踪中查找NSInternalInconsistencyException的来源

    我没有在此堆栈跟踪中的任何位置看到任何可识别的文件名,方法调用或行号.或者,如果不是简单地读取堆栈跟踪并且涉及其他技术,那么开发人员应该采取哪些适当的下一步来追踪此类错误的来源?

  7. ios – 非常规形状的NSTextContainer示例?

    嗨,我正在使用iOS7的新TextKitAPI,我正在尝试生成一个不规则形状的UITextView.到目前为止,我在视图控制器中:然后在我的子类NSTextContainer中,我想将一个mutablePath绘制为文本容器的形状,但不知道如何实现这一点.我有:对于如何使其工作有点困惑.我找不到具有不规则形状的NSTextContainer的任何示例.解决方法不需要构建TextKit堆栈的所有代码

  8. ios – UINavigationBar -pushNavigationItem在将新控制器推送到UINavigationController堆栈时从不调用

    解决方法我找到了原因:它调用–pushNavigationItem:项不调用–pushNavigationItem:animated!

  9. ios – NSURLConnectionLoader线程中的奇怪崩溃

    我们开始看到我们的应用启动时发生的崩溃.我无法重现它,它只发生在少数用户身上.例外情况是:异常类型:EXC_BAD_ACCESS代码:KERN_INVALID_ADDRESS位于0x3250974659崩溃发生在名为com.apple.NSURLConnectionLoader的线程中在调用时–[NSBlockOperationmain]这是该线程的堆栈跟踪:非常感谢任何帮助,以了解可能导致这种崩

  10. ios – 合并子上下文时的NSObjectInaccessbileExceptions

    我尝试手动重现,但失败了.是否有其他可能发生这种情况的情况,是否有处理此类问题的提示?解决方法在创建子上下文时,您可以尝试使用以下行:

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部