我正在修復findbug
提出的 Lazy initialization of "static" fields should be "synchronized"
建議的問題。 This鏈接暗示要麼我必須使字段變量volatile
或使初始化塊。哪種方法更好?每種方法的優缺點是什麼?「靜態」字段的延遲初始化應該是「同步」 - 如何修復它
回答
在你的例子中,你應該使用,因爲volatile
不能保證原子性。 如果您使用volatile
,則可以初始化該對象的多個實例。
有沒有更好。
只有幾種不同的模式如何解決這個問題。有關該主題的完整討論,請參閱here。
從這個意義上說:對於新手在做第一步,只需使用方法即可。對於「專業」使用 - 請參閱上述鏈接;並確定哪些解決方案最適合您的需求。
讓我們說我有一個字符串聲明,並得到初始化,這成爲線程不安全。對於這種情況,我可以讓字符串字段變成易失性的,以便它初始化的值可以立即用於所有線程。 – aravindkanna
* volatile *表示讀/寫**總是**訪問**內存**。與訪問可以駐留在本地緩存中的內容相比,訪問內存比**慢一個數量級**!因此:是的,當然,揮發性解決了問題。但它的成本。因此,你小心使用它**。 – GhostCat
對於這個問題的每一個實例,如果我使用雙重檢查鎖定習慣用法,就像您提供的資源中所建議的那樣,這樣會有效嗎?或使整個「同步」塊效率更高?問題是如果我有一個很大的方法,所有的指令都可以並行執行,除了初始化語句,使整個方法'synchronized'可能會影響效率。我認爲這種損失超過了我們面臨的波動。糾正我,如果我錯了。 – aravindkanna
- 1. 延遲初始化
- 2. Java靜態字段初始化
- 3. 新的延遲初始化
- 4. 靜態字段無法初始化
- 5. 延遲初始化 - 休眠
- 6. 靜態字段/屬性初始化
- 7. 當靜態字段初始化發生?
- 8. 靜態初始化和靜態同步方法鎖定問題
- 9. 延遲初始化表
- 10. jQuery DataTables初始化延遲
- 11. Sakai Hibernate延遲初始化
- 12. boost.serialization和延遲初始化
- 13. Tensorflow初始化延遲
- 14. 如何實現RAII +延遲初始化?
- 15. 如何延遲初始化類
- 16. 延遲初始化總是返回空
- 17. 靜態類初始化階段
- 18. 檢測靜態初始化階段?
- 19. 如何防止靜態方法中靜態字段的多重初始化?
- 20. 訪問Haxe靜態字段的靜態初始化的非靜態數據
- 21. 靜態初始化
- 22. 渴望初始化VS延遲初始化使用情況
- 23. Spring的靜態初始化
- 24. .Net Singleton屬性的延遲初始化
- 25. 靜態字段 - EasyPost - ClientManager初始
- 26. Hibernate:部分延遲初始化?
- 27. 靜態變量初始化
- 28. Maploader延遲初始化與索引
- 29. 延遲和手動初始化MDL materialLayout
- 30. 靜態HashMap的初始化
這取決於你的代碼的細節。 – shmosel