2013-03-17 42 views
2

我有,我想初始化一些靜態的,「常數」的情況(即初始化之後沒有修改過)的數據結構。我在「靜態{}」代碼塊中執行此操作。它保證這個代碼塊不會被兩次輸入嗎?在某些特殊情況下我需要同步嗎?靜態類初始值設定項 - 是否有需要同步的情況?

更新:答案就在Are Java static initializers thread safe?

部分給出剩下的問題:如何才能靜態初始化被執行多次?這是否重要?我猜它對不同的靜態「實例」運行不止一次,即。在不同的webapp上下文中,並附加到不同的類加載器上,這樣它們就不會彼此「看到」。正確?

+1

每個靜態初始化每個類裝載器初始化類運行一次。每個初始化操作都在靜態字段的不同副本上進行。 – 2013-03-17 17:11:13

回答

2

的JVM保證了所有類的靜態初始化塊被稱爲只有一次(第一次加載類時)。因爲它只會調用一次,沒有必要對任何同步的代碼,因爲這與只有一次規則相矛盾。

就拿更多關於類加載和靜態類初始化看看here。從該頁面

報價:

什麼編譯器實際上做的是在內部產生一個類初始化程序,結合了所有的靜態變量初始化,所有的代碼靜態初始化塊,出現的順序它們出現在類聲明中。這個單一的初始化過程是自動運行的,只有一次,當第一次加載類時。     –大衛那根

1

我要初始化一些靜態的,「常數」(即初始化之後沒有修改過)的數據結構

使該變量決賽。

public static final CONSTANT = 10; 

OR

你可以把代碼中的靜態塊。它在類加載時執行一次。

+0

哪個變量?他正在談論一個'static {}'塊,不是嗎? – NPE 2013-03-17 17:08:42

+0

是的。它更復雜。右側拋出一個必須被捕獲的異常。但這不是問題。即使在簡單賦值的情況下,也可能存在併發問題...... – user1050755 2013-03-17 17:10:34

相關問題