我們能否在 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;

更新於:2020 年 7 月 2 日

1K+ 次瀏覽

開啟您的 職業生涯

完成課程即可獲得認證

開始學習
廣告