Вот пример, о котором я хотел бы спросить:
Код: Выделить всё
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...
}
}
}
Код: Выделить всё
list = new ArrayList();
А вот цитата из книга под названием «Параллелизм Java на практике»
Эффект видимости изменчивых переменных выходит за рамки значения самой изменчивой переменной. Когда поток A записывает в изменчивую переменную, а затем поток B читает ту же самую переменную, значения всех переменных, которые были видимы для A до записи в изменчивую переменную, становятся видимыми для B после чтения изменчивой переменной. Таким образом, с точки зрения видимости памяти запись энергозависимой переменной аналогична выходу из синхронизированного блока, а чтение энергозависимой переменной похоже на вход в синхронизированный блок.
Эта цитата Это также причина, по которой я создал Летучий int, который поток записи увеличивает каждый раз, когда он записывает в список, вместо того, чтобы делать сам список изменчивым.
Итак, я протестировал этот пример с изменчивым параметром и без него. переменная (замена currentIndex >= listSize на currentIndex >= list.size() ), а без изменчивой переменной поток чтения полностью блокируется, фактически никогда не видя добавленных элементов в список. Однако с изменчивой переменной поток чтения мгновенно видит изменение в списке. На первый взгляд цитата из книги верна, но я хотел бы быть уверенным, поскольку пример, который я написал, основан на чем-то другом, что я пишу, и было бы не здорово, если поток чтения будет блокироваться на неопределенный срок.
Изменить: Вращение потока предназначено для увеличения шансов на кэширование.
Подробнее здесь: https://stackoverflow.com/questions/780 ... es-in-java