java – Struts2中的拦截器线程是否安全?
我明白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启动时(在单个线程中)设置,如 如果您计划编写自己的Interceptor,只需使用您在intercept()方法中传入的ActionInvocation参数和局部变量即可.避免使你的截取方法同步或将事情放入同步的{}块的诱惑 – 这将创建一个使用Struts的单实例方法拦截拦截器的瓶颈. 从评论中回答问题:
使用现代JVM,创建对象的成本可以忽略不计.如果您通过避免昂贵的初始化来保持动作轻巧,那么对性能没有明显的影响,例如通过不在操作中创建数据库连接,但使用连接池.
我不认为任何出货和配置Struts 2的默认拦截器不是线程安全的;即使他们使用实例字段(因为它们仅用于配置或本身线程安全,如Logger). 根据我的个人经验,如果你有一个很好的理由(内置拦截器的线程安全性不是一个),你应该只能触摸/更改拦截器堆栈.如果您更改堆栈 – 运行其中一个内置堆栈(如“default”或“paramPrepareParam”),很多事情会以意想不到的方式运行/中断,从长远来看可以节省很多挫折.添加自己的自定义拦截器通常比从现有堆栈中删除/重新排列拦截器的破坏性更小. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |