English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Декоратор 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;