2012-08-08 96 views
2

我知道Struts 2 Actions是线程安全的。但是如果这些Action类包含对实用静态方法的方法调用会发生什么?线程安全性会受到影响吗?Struts 2 Action访问静态方法时的线程安全性

拿一个实用的方法来解析一个上传的excel文件等等。如果该方法被声明为静态的,它应该是同步的吗?

更新:

我只是读取文件,并将该文件提交到行动,以便它本身应该是线程安全的。但由于分析是一种实用工具方法来完成我我怀疑同步是否有必要。但显然如果你只访问方法范围变量,它应该是线程安全的。但像File这样的参数属于这个类别吗?

+0

你是指哪个文件被提交给该操作?如果是这种情况,它会为每个请求,并不会被共享。 – 2012-08-08 08:49:11

+0

显示一些代码,否则我们只是猜测。根据定义,参数*是方法范围变量。在进一步深入研究之前,您可能需要重新研究一些Java基础知识。 – 2012-08-08 15:09:29

+0

原始参数,是的。引用可变的对象不是很多..为你刷光了足够吗? – Thihara 2012-08-08 16:21:06

回答

3

按我的理解线程安全不会受到影响,直到除非你是玩弄threads.you之间共享数据,必须注意的原子性,可视性等

如果有任何方法级变量被复制在每个线程执行堆栈中,只有存在共享数据时才会出现竞争条件,因此我们需要照顾。

虽然堆栈对当前线程是本地的,但是可以引用该堆栈上的共享对象。

+0

动作类是线程本地的。但是任何静态方法对整个JVM都是可见的吗?那么如何在没有同步的情况下实现线程安全?或者我在这里错过了什么? – Thihara 2012-08-08 05:57:18

+0

@Thihara:我说的问题只会出现在你试图对共享数据进行一些操作时,局部变量不会受到这个问题 – 2012-08-08 06:00:27

+0

如果你的静态方法访问你的excel文件,那么它必须被同步。您必须确保资源不被同时访问。这也适用于会话中的非原子对象。 如果你只有对资源的读取权限,那么这通常不是问题(迭代器除外)。 – VolkerK 2012-08-08 06:50:21