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