Гарантии видимости изменчивых переменных в JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Гарантии видимости изменчивых переменных в Java

Сообщение Anonymous »

Я прочитал несколько сообщений о изменчивых переменных в Java. Но я все еще немного в замешательстве, не говоря уже о том, что некоторые из них противоречат друг другу.
Вот пример, о котором я хотел бы спросить:

Код: Выделить всё

public class Main {

static  ArrayList list = new ArrayList();
static volatile int listSize = 0;

public static void main(String[] args) {
Thread writer = new Thread(Main::write);
Thread reader = new Thread(Main::read);
writer.start();
reader.start();
}

public static void write() {
while (true) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
return;
}
list.add(1);
listSize++;
System.out.println("Added an element.");

}
}

public static void read() {
int currentIndex = 0;
while (true) {
if(currentIndex>=listSize) {
continue;
}
System.out.println("Read an element.");
int element = list.get(currentIndex);
currentIndex++;
// do stuff with element...
}
}
}
Итак, в этом примере поток записи записывает в ArrayList, а поток чтения считывает элементы из этого списка. Согласно некоторым ответам на эту тему, даже если бы я сделал сам список изменчивым, у него не было бы никаких гарантий видимости между потоками для содержимого списка, только для самого объекта списка. . Другими словами, если поток записи сделает это:

Код: Выделить всё

list = new ArrayList();
Читатели ветки узнают об этом. Но если поток записи добавляет/удаляет/изменяет список, как в примере выше, нет никакой гарантии, что поток чтения когда-либо увидит его.
А вот цитата из книга под названием Java Concurrency in Practice Брайана Гетца и др.

Эффект видимости изменчивых переменных выходит за рамки значения изменчивых переменных. сама переменная. Когда поток A записывает в изменчивую переменную, а затем поток B читает ту же самую переменную, значения всех переменных, которые были видимы для A до записи в изменчивую переменную, становятся видимыми для B после чтения изменчивой переменной. Таким образом, с точки зрения видимости памяти запись энергозависимой переменной аналогична выходу из синхронизированного блока, а чтение энергозависимой переменной похоже на вход в синхронизированный блок.

Эта цитата Это также причина, по которой я создал изменчивый int, который поток записи увеличивает каждый раз, когда он записывает в список, вместо того, чтобы сделать сам список изменчивым.
Итак, я протестировал этот пример с изменчивой переменной и без нее. (заменив currentIndex >= listSize на currentIndex >= list.size() ), и без изменчивой переменной поток чтения полностью блокируется, фактически никогда не видя добавленных элементов в список. Однако с изменчивой переменной поток чтения мгновенно видит изменение в списке. На первый взгляд цитата из книги верна, но я хотел бы быть уверенным, поскольку пример, который я написал, основан на чем-то другом, что я пишу, и было бы не здорово, если поток чтения будет блокироваться на неопределенный срок.

Изменить: Вращение потока предназначено для увеличения шансов на кэширование.

Подробнее здесь: https://stackoverflow.com/questions/780 ... es-in-java
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Гарантии видимости изменчивых переменных в Java
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Гарантии видимости изменчивых переменных в Java
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Гарантии видимости изменчивых переменных в Java
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Гарантии видимости изменчивых переменных в Java
    Anonymous » » в форуме JAVA
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Гарантии видимости резьбы и трубопроводы реактора проекта
    Anonymous » » в форуме JAVA
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»