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