// 主線程
while (true) {
if (f.getTimes() >= 2) { // 可能永遠為 false
break;
}
}
// 子線程修改 times
public synchronized void getMoney() {
// ...
times++;
}
times 非 volatile,主線程將其值缓存到寄存器,不感知子線程的修改。Debug 模式或添加打印會延長執行時間,觸發緩存刷新,掩蓋問題。
private volatile int times = 0; // 強制從主內存讀寫
times++ 仍需 synchronized 或 AtomicIntegerclass Family implements Runnable {
private volatile int times = 0; // 加上 volatile
public synchronized void getMoney() {
// ...
times++; // 復合操作,synchronized 保證原子性
}
public int getTimes() {
return times; // volatile 保證可見性
}
}