該程序的答案必須在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的目標。他似乎感到驚訝的是,工作者線程正在打印「完成!!!!」。 – CodeBlind