我们能在 Java 中使用 volatile 关键字将数组变为 volatile 吗?

java 8object oriented programmingprogramming更新于 2024/10/14 17:33:00

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

访问 volatile 变量会同步主内存中所有缓存的变量副本。Volatile 只能应用于实例变量,这些变量的类型为 object 或 private。volatile 对象引用可以为 null。

示例

public class MyRunnable implements Runnable {
   private volatile boolean active;
   public void run() {
      active = true;
      while (active) { // 第 1 行
         // 此处为一些代码
      }
   }
    public void stop() {
      active = false; // 第 2 行
   }
}

使数组变为 volatile

尽管我们将数组声明为 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;

相关文章