Код: Выделить всё
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