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

Java 多執行緒 volatile 無法保證原子性:num++ 非原子操作導致資料競爭產生重複值

     編輯:程式設計綜合問答

程式碼中 volatile int num 僅保證可見性,不保證原子性。num++ 包含讀取、遞增、寫入三步驟,兩執行緒可能同時讀取舊值 0,各自遞增寫入 1,導致輸出 1,1。解決方法:

  1. 使用 synchronized 同步區塊:synchronized(this) { num++; }
  2. 或改用 AtomicInteger:AtomicInteger num = new AtomicInteger(); num.incrementAndGet();

volatile 適用於單一寫入、多讀取的旗標變數,不適用於複合操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved