首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 多線程 volatile 關鍵字解決主線程讀取共享變量延遲問題

     編輯:程式設計疑難解答

問題代碼

// 主線程
while (true) {
    if (f.getTimes() >= 2) { // 可能永遠為 false
        break;
    }
}

// 子線程修改 times
public synchronized void getMoney() {
    // ...
    times++;
}

原因

times 非 volatile,主線程將其值缓存到寄存器,不感知子線程的修改。Debug 模式或添加打印會延長執行時間,觸發緩存刷新,掩蓋問題。

解決

private volatile int times = 0; // 強制從主內存讀寫

volatile 語義

  • 可見性:寫入後立即刷新到主內存,其他線程讀取時強制從主內存加載
  • 禁止指令重排序:防止編譯器/CPU 優化導致邏輯錯誤
  • 不保證原子性:times++ 仍需 synchronized 或 AtomicInteger

完整修正

class Family implements Runnable {
    private volatile int times = 0; // 加上 volatile
    
    public synchronized void getMoney() {
        // ...
        times++; // 復合操作,synchronized 保證原子性
    }
    
    public int getTimes() {
        return times; // volatile 保證可見性
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved