我們能否在 Java 中使用 volatile 關鍵詞使陣列易失?
volatile 修改器指示 JVM 訪問 volatile 變數的執行緒應始終從記憶體獲取資料。也就是說,執行緒不應快取 volatile 變數。
訪問 volatile 變數會將主記憶體中所有變數的快取副本同步。volatile 僅可應用於型別為物件或私有變數的例項變數。volatile 物件引用可以為 null。
示例
public class MyRunnable implements Runnable { private volatile boolean active; public void run() { active = true; while (active) { // line 1 // some code here } } public void stop() { active = false; // line 2 } }
使陣列變為 volatile
但即使我們宣告陣列 volatile,陣列中的元素也不具有 volatile 行為。
為了解決此問題,Java 提供了兩個類,即 AtomicIntegerArray 和 AtomicLongArray,它們表示陣列(在(各自)變數上有原子包裝器),自動更新這些陣列的元素。
也就是說,可以訪問由這些類表示的這些陣列的各個元素,因為它們是 volatile 變數。這些類提供 get() 和 set() 變數,分別用於檢索或指定每個元素的值。
由於可為整數和長整型提供原子包裝器,因此對於其餘資料型別,每次為其指定一個元素時,都需要重新指定陣列的引用值。
volatile int[] myArray = new int[3]; myArray [0] = 100; myArray = myArray; myArray [1] = 50; myArray = myArray; myArray [2] = 150; myArray = myArray;
廣告