Почему моя Java-программа зависает, хотя один поток обновляет общую переменную? [дубликат]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему моя Java-программа зависает, хотя один поток обновляет общую переменную? [дубликат]

Сообщение Anonymous »

Я пытаюсь понять параллелизм Java и видимость памяти. Я написал следующую программу:

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

class SharedData {
int flag = 0;
}

public class ThreadTest {

public static void main(String[] args) {
SharedData data = new SharedData();

Thread t1 = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (Exception e) {}
data.flag = 1;
System.out.println("Writer thread updated flag to: " + data.flag);
});

Thread t2 = new Thread(() -> {
while (data.flag == 0) {
// busy waiting
}
System.out.println("Reader thread saw flag: " + data.flag);
});

t2.start();
t1.start();
}
}
Проблема:
Иногда программа никогда не завершается, и t2 продолжает ждать вечно, хотя t1 явно устанавливает флаг = 1.
Мои вопросы:
  • Почему это происходит, хотя оба потока используют один и тот же объект?
  • Почему это не гарантированно работает в Java?
  • Каково правильное решение?
    • Должен ли я использовать изменчивый?
    • Должен ли я использовать синхронизированный?
    • Или мне следует использовать AtomicInteger?
Я был бы признателен за объяснение с точки зрения:
  • Модели памяти Java
  • Кэширования ЦП
  • Происходит до связи


Подробнее здесь: https://stackoverflow.com/questions/798 ... d-variable
Ответить

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

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

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

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

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