Ответ на эту программу должен быть «Замедление» через 5 секунд, но я получаю «Смена сделанного» и «Совершено». У меня нет метода getDone как синхронизированный. Любые идеи, что я делаю для потока, чтобы закончить обработку.java synchronized Очистка проводов
public class Main {
private static boolean done = false;
private static int count;
public static void main(String[] args)throws InterruptedException {
new Thread(() -> {
while (!getDone()) {
count = count + 1;
}
System.out.println("DONE!!!!");
}).start();
Thread.sleep(5000);
System.out.println("Changing done");
synchronized (Main.class) {
done = true;
}
}
public static boolean getDone() {
return done;
}
}
Ваша программа делает именно то, что я ожидаю от нее. Вы ожидали, что ваш анонимный «Runnable» не закончит? – CodeBlind
@CodeBlind: доступ к 'done' не синхронизирован должным образом, вызов' getDone() 'может не увидеть текущее значение. – user140547
Худшее, что может случиться здесь, - это рабочий поток, возможно, не видит изменения в 'done' немедленно, но это, безусловно, в конечном итоге. Поскольку только один поток когда-либо изменяет 'done', вы можете избежать использования ключевого слова' volatile' в своем объявлении и полностью уничтожить блок 'synchronized'. Но это все вода под мостом - я до сих пор не понимаю, что делает OP. Кажется, он удивлен, что рабочий поток печатает 'DONE !!!!'. – CodeBlind