如何製作一個陣列易失性?因爲正如我已經理解的那樣,使數組變得不穩定是不安全的。Java易失性數組?
回答
AtomicLongArray,AtomicIntegerArray,AtomicReferenceArray(java.util.concurrent.atomic)。
編輯: 在java中的數組對象。如果您將該對象的引用設置爲volatile,那麼如果將引用交換到數組,則使其對其他線程可見。 但是,這並不適用於數組值本身。
爲了獲得更好的java內存模型,實際上有可能在沒有Atomic * Array的情況下繞過它。如果線程A在之後寫入一些非易失性內容和易失性變量,那麼線程B將保證看到易失性內容的變化而且只有在線程B首先讀取volatile變量的情況下。 還看到: Happens-before relationships with volatile fields and synchronized blocks in Java - and their impact on non-volatile variables?
對於數組,這意味着: 後寫入陣列,寫入一些揮發性狀態變量(請務必寫實際上改變了揮發性狀態變量!) 當你從陣列讀取,首先讀取volatile狀態變量,然後訪問數組。 易失性讀取應該使所有其他寫入都可見,只要它們發生在前面。
老: 寫自我參考arr=arr
實際上不會幫助。
您寫入數組arr
的地址,而不是字段arr[i]
的值。因此,您仍不會獲得arr[i]
(您需要)的易失性屬性,但僅適用於存儲地址arr
。
傑里米·曼森前面提到的博文解釋得很詳細: http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html
他最好的解決辦法是使用原子*陣列,即AtomicReferenceArray泛型類型(也存在特殊形式爲基本類型)。我無法想象這是特別有效的,尤其是因爲它爲您提供了更多您需要的屬性(原子性>>易失性)。
替代方案可能是容器使用易失性指針字段的指針結構。也沒那麼高效......
- 1. Java在原始數據上易失性
- 2. 易失性函數
- 3. Java易失性讀取刷新寫入和易失性寫入更新讀取
- 4. Java - 易失性不按預期工作
- 5. 爲什麼Java中需要易失性
- 6. 易失性超載?
- 7. 易失性的int?
- 8. 易失性寫入非易失性寫入重新排序
- 9. 爲易失性和非易失性實例重載類
- 10. 優化易失性數據查詢
- 11. 易失性的成員函數和const
- 12. Java中的易失性關鍵字 - 說明性
- 13. Java如何管理易失性字段的可見性?
- 14. Java對於併發性而言是易失性的
- 15. 易失性關鍵字 - MSP430
- 16. 非易失性變量
- 17. 易失性和多線程?
- 18. 聯鎖和易失性
- 19. 易失性和同步
- 20. 易失性結構語義
- 21. 易失性讀取是否發生在易失性寫入之前?
- 22. 在java中註冊非易失性變量的配置
- 23. java - 易失性關鍵字也適用於非基元
- 24. 持久性與易失性數據混合
- 25. 線程安全無易失性
- 26. 方法中是否需要「易失性」?
- 27. scipy curve_fit容易線性擬合失敗?
- 28. 同步在一起的易失性
- 29. 非易失性printf式記錄器
- 30. GCC原子builtin和易失性
http://jeremymanson.blogspot。com/2009/06/volatile-arrays-in-java.html – 2011-03-02 21:21:50