2012-09-23 22 views
-1

在一個類中,如果有Static Variable,某些開發人員建議通過Synchronize Methods來訪問它們,因爲訪問該變量的進程正在運行時,另一個進程可以更改該變量的值。這是錯的嗎?它也和Thread Safe有關嗎?靜態變量是否應該只在同步代碼中加入?

+4

除了廣泛解釋什麼是同步意味着什麼之外,沒有更多信息是不可能的。 – assylias

+2

你似乎對這些主題很新穎。在繼續之前,我建議你閱讀[The Java Tutorials on Concurrency](http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html)。 – Keppil

回答

0

僅僅因爲一個變量是static並不意味着它需要被保護以防併發修改。

+0

不要發表評論作爲答案! – CKing

+0

我重讀了原來的問題,並認爲我的答案是確切的。 –

+0

這可能是準確的。但是,您需要解釋您的索賠,而不是僅僅提出索賠。我對你答案的即時反應是'爲什麼不呢?'如果沒有,那麼何時保護併發訪問的變量?你的回答不完整! – CKing

0

如果預計在併發環境中使用包含該變量的類,則該靜態變量不是最終的(或者是一個不可變對象),那麼您最好通過同步acces來控制它,否則,會更好如果你不這樣做,因爲同步方法或塊的性能較低。

1

是的,這與線程安全有關,而不是進程(每個進程通常都有自己的內存,所以沒有對變量的共享訪問)。

只要一個變量可以被多個線程訪問,就需要添加某種形式的同步以確保在一個線程中所做的更改對其他線程可見,並且您對該變量的操作(以及可能相關的變量)不會互相干擾。

同步訪問靜態變量通常是一個好主意,因爲通常很難排除它會從多個線程訪問,特別是如果該變量也是公共的。

如果這個變量是一個常量,即它只在靜態初始化過程中設置,並且在此之後永遠不會改變,那麼您可以使其成爲final而不是同步訪問。同樣,根據變量的用途,它可能足以使其變爲易失性的,至少可以確保對其值的更改立即對所有線程可見。

相關問題