2012-08-08 93 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