靜態實例線程安全
回答
假設ConcreteStrategy
沒有修改,或者只是以線程安全的方式修改,那麼是的。 final
修改器將確保(在Java 1.5+中)所有線程都至少在初始化類時所處的狀態下看到INSTANCE
對象。對對象的任何後續更改都需要以通常方式(通過volatile,同步,提供線程安全的類等)進行線程安全。
糾正我,如果我錯了:當我調用函數對象引用副本傳遞給方法,所以每次方法執行不同的對象。 該類用於webapp中,這些調用只共享代碼? – landal79 2012-02-09 13:53:49
@ landal79:Java傳遞引用的副本。所以「aClass」參數是參考文獻的副本。但是正在使用和返回的AClass對象是相同的。把它想成指針。你可以傳遞指針,指針副本等等,但是指向的對象是一樣的。如果有一個'new',則有一個對象。 – helios 2012-02-09 14:00:33
新JMM的「最終字段語義」在這裏是無關緊要的。一旦靜態初始化程序完成其工作,所有線程都會看到一個完全初始化的'ConcreteStrategy'類,只要它不做一些非常愚蠢的事情。 – 2012-02-09 15:58:12
通常,任何不可變或無狀態的java對象都是線程安全的。
你的例子是差不多線程安全。
參考到INSTANCE是線程安全的,因爲它是最終的。但是ConcreteStrategy的內容可能不是線程安全的(我們看不到代碼,因此無法說明)。
如果您向ConcreteStrategy對象提供適當的同步,那麼它可能是一個非常好的線程安全對象。
乾杯,尤金。
- 1. 靜態關鍵字,狀態/實例變量和線程安全
- 2. 靜態方法和線程安全
- 3. Java靜態和線程安全
- 4. Java靜態方法和線程安全
- 5. 是靜態方法線程安全
- 6. 線程安全和靜態函數
- 7. 靜態方法和線程安全
- 8. 靜態方法的線程安全
- 9. 線程安全對象 - 是否靜態?
- 10. C#線程安全靜態成員
- 11. 靜態類的線程安全
- 12. 是靜態方法線程安全的
- 13. 靜態委託是否線程安全?
- 14. 線程安全和靜態子類
- 15. 線程安全訪問靜態集合
- 16. SqlServer類靜態方法 - 線程安全
- 17. 靜態對象線程安全
- 18. 是靜態類線程安全
- 19. Java - 靜態方法的線程安全
- 20. 爲什麼靜態內部類單例線程安全
- 21. 是否正在實例化非最終靜態變量線程安全?
- 22. 是否在靜態PageMethod線程安全內部創建類的實例?
- 23. 靜態方法和靜態塊之間的線程安全
- 24. 如何確保實用靜態方法的線程安全?
- 25. 線程安全的實例字段
- 26. NSManagedObject實例的線程安全性?
- 27. 的Java:線程安全類的實例
- 28. File實例線程安全嗎?
- 29. 線程安全:類的實例
- 30. 實例變量的實例方法和線程安全
順便說一句:添加一個私有構造函數,以便您知道沒有人正在創建ConcreteStrategy的另一個實例(如果這是想要的行爲:) – helios 2012-02-09 14:01:35
並且讓您在課程中使用「final」類。 – 2012-02-09 15:58:42