Программисты JAVA общаются здесь
Anonymous
Почему моя Java-программа зависает, хотя один поток обновляет общую переменную? [дубликат]
Сообщение
Anonymous » 21 янв 2026, 15:22
Я пытаюсь понять параллелизм 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
1768998127
Anonymous
Я пытаюсь понять параллелизм Java и видимость памяти. Я написал следующую программу: [code]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(); } } [/code] Проблема: Иногда программа никогда не завершается, и t2 продолжает ждать вечно, хотя t1 явно устанавливает флаг = 1. Мои вопросы: [list] [*]Почему это происходит, хотя оба потока используют один и тот же объект? [*]Почему это не гарантированно работает в Java? [*]Каково правильное решение? [list] Должен ли я использовать изменчивый? [*]Должен ли я использовать синхронизированный? [*]Или мне следует использовать AtomicInteger? [/list] [/list] Я был бы признателен за объяснение с точки зрения: [list] [*]Модели памяти Java [*]Кэширования ЦП [*]Происходит до связи [/list] Подробнее здесь: [url]https://stackoverflow.com/questions/79872074/why-does-my-java-program-hang-even-though-one-thread-updates-a-shared-variable[/url]