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

Можем ли мы использовать ключевое слово volatile, чтобы сделать массив volatile в Java?

Декоратор volatile указывает JVM, что线程, доступ к переменной volatile, должен всегда извлекать данные из памяти. То есть,线程 не должен кэшировать переменные volatile.

Доступ к переменным volatile синхронизирует все копии переменных, хранящихся в основном хранилище. Изменяемые переменные могут применяться только к типам объектов или частным переменным типов. Ссылка на объект volatile может быть null.

Пример

public class MyRunnable implements Runnable {
   private volatile boolean active;
   public void run() {
      active = true;
      while (active) { // строка 1
         // Здесь находитсяsome код
      }
   }
   public void stop() {
      active = false; // строка 2
   }
}

Сделать массив несомненным

Несмотря на то, что мы объявляем массив как volatile, элементы массива не обладают свойством volatile.

Для решения этой проблемы Java предоставляет два класса, namely AtomicIntegerArray и AtomicLongArray, которые представляют массивы с атомарной упаковкой переменных (соответственно), элементы которых автоматически обновляются.

То есть, элементы массива, представляющего эти классы, можно получить как изменяемые переменные. Эти классы предоставляютget()и}}set()Переменные для отдельного поиска или назначения значений каждому элементу.

Поскольку атомарные обертки доступны для целых типов и типов long, а其余 типы данных доступны, при каждом распределении элемента в массив необходимо заново распределить ссылку на массив.

volatile int[] myArray = new int[3];
myArray[0] = 100;
myArray = myArray;
myArray[1] = 50;
myArray = myArray;
myArray[2] = 150;
myArray = myArray;
Основной учебник