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