English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

我们可以在Java中使用volatile关键字使volatile变成数组吗?

volatile修饰符指示JVM,访问volatile变量的线程应始终从内存中获取数据。即线程不应该缓存volatile变量。

访问易失性变量将同步所有在主存储器中缓存的变量副本。可变变量只能应用于对象类型或私有类型的实例变量。易失性对象引用可以为null。

示例

public class MyRunnable implements Runnable {
   private volatile boolean active;
   public void run() {
      active = true;
      while (active) { // line 1
         //一些代码在这里
      }
   }
   public void stop() {
      active = false; // line 2
   }
}

使数组易失

尽管我们声明数组为volatile,但数组的元素没有volatile行为。

为解决此问题,Java提供了两个类,即AtomicIntegerArray和AtomicLongArray,它们表示在(各自)变量上具有原子包装的数组,这些数组的元素会自动更新。

也就是说,可以将这些类表示的数组的各个元素作为易变变量访问。这些类提供get()set()变量来分别检索或为每个元素分配值。

由于原子包装器可用于整数类型和长类型,而其余数据类型可用,因此每次向数组分配元素时,都需要重新分配数组的引用值。

volatile int[] myArray = new int[3];
myArray [0] = 100;
myArray = myArray;
myArray [1] = 50;
myArray = myArray;
myArray [2] = 150;
myArray = myArray;