在一個類中,如果有Static Variable
,某些開發人員建議通過Synchronize Methods
來訪問它們,因爲訪問該變量的進程正在運行時,另一個進程可以更改該變量的值。這是錯的嗎?它也和Thread Safe
有關嗎?靜態變量是否應該只在同步代碼中加入?
-1
A
回答
0
0
如果預計在併發環境中使用包含該變量的類,則該靜態變量不是最終的(或者是一個不可變對象),那麼您最好通過同步acces來控制它,否則,會更好如果你不這樣做,因爲同步方法或塊的性能較低。
1
是的,這與線程安全有關,而不是進程(每個進程通常都有自己的內存,所以沒有對變量的共享訪問)。
只要一個變量可以被多個線程訪問,就需要添加某種形式的同步以確保在一個線程中所做的更改對其他線程可見,並且您對該變量的操作(以及可能相關的變量)不會互相干擾。
同步訪問靜態變量通常是一個好主意,因爲通常很難排除它會從多個線程訪問,特別是如果該變量也是公共的。
如果這個變量是一個常量,即它只在靜態初始化過程中設置,並且在此之後永遠不會改變,那麼您可以使其成爲final而不是同步訪問。同樣,根據變量的用途,它可能足以使其變爲易失性的,至少可以確保對其值的更改立即對所有線程可見。
相關問題
- 1. 我應該聲明由SerialPort的回調加入的變量是否同步?
- 2. 同步靜態變量的方法是否夠用了?
- 3. 在構造函數中訪問共享靜態變量是否需要同步?
- 4. Java - 靜態變量不同步
- 5. 在非靜態類中鎖定靜態變量是否安全?
- 6. 製作靜態方法是否同步
- 7. 同一類中的Java靜態變量和非靜態變量
- 8. 運行的代碼,使靜態變量
- 9. 靜態變量initalization在C++ 11中同步?
- 10. 靜態同步方法vs靜態方法,所有代碼都在同步塊中
- 11. 是否繼承了靜態變量
- 12. 靜態constexpr變量是否有意義?
- 13. 我應該在DLL的函數中使用靜態變量嗎?
- 14. 我在應用程序類中的全局變量,實例和單例是否應該是靜態的?
- 15. 如果靜態編譯的代碼想要訪問內核模塊代碼中的變量,那麼該模塊是否必須靜態編譯?
- 16. 如果我有隻有一個靜態變量的類 - 我應該聲明這個類是靜態的嗎?
- 17. 我應該使用全局變量的靜態類還是隻使用靜態屬性?
- 18. 替代靜態變量
- 19. 替代靜態變量?
- 20. 靜態變量是否應該用於僅實例化一次的類
- 21. 同步(this)只鎖定同步塊還是全部「this」代碼?
- 22. 靜態後期綁定是否需要重載靜態變量?
- 23. 靜態類中的靜態變量和非靜態類中的靜態變量
- 24. 訪問同步塊中的靜態變量
- 25. 在哪些內存中存在靜態變量,局部變量是否存在?
- 26. 在C++中,靜態對象是否可以超出其靜態成員變量?
- 27. 靜態變量是否可以在C++中不存在類?
- 28. 靜態方法中的局部變量是否也是靜態的?
- 29. 在java中添加一個靜態變量和一個非靜態變量
- 30. 的靜態變量的使用,同時使用叉加入
除了廣泛解釋什麼是同步意味着什麼之外,沒有更多信息是不可能的。 – assylias
你似乎對這些主題很新穎。在繼續之前,我建議你閱讀[The Java Tutorials on Concurrency](http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html)。 – Keppil