我们能否在 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+ 次浏览

开启您的 职业生涯

完成课程即可获得认证

开始学习
广告