(Java學習筆記)i++不是原子性操作
阿新 • • 發佈:2018-12-13
public class CasStudy01 { private static int count = 0; public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { count++; } }; for (int i = 0; i < 10000; i++) { new Thread(runnable).start(); } System.out.println(count); } }
輸出: 9945
Process finished with exit code 0
剛才的程式碼,照我們的設想,他應該是輸出10000,然而每次我們run這段demo,輸出結果各不相同 這是因為count++這一行程式碼並不是原子操作,這一行程式碼實際在執行時,被分為取值,修改,儲存三步操作,所以1,2兩個執行緒同時取出值a,並且自增1修改為a+1,再儲存的話,兩次自增實際上只自增了1