Q:i++是線程安全的嗎?
A:如果是局部變量,那么i++是線程安全。
如果是全局變量,那么i++不是線程安全的。
理由:如果是局部變量,那么i++是線程安全:局部變量其他線程訪問不到,所以根本不存在是否安全這個問題。
如果是全局變量,那么i++不是線程安全的:當它是全局變量時,所有線程都可以訪問,那么,當有1000個線程同時執行i++操作時,i變量的副本拷貝到每個線程的線程棧,當同時有兩個線程以上的線程讀取線程變量,比如此時是5,那么同時執行i++操作,再寫入到全局變量,最后,兩個線程跑完了,這個i還是6,而並不會是7,所以,出現不安全性。
從更底層的角度講,主要是因為i++這個操作不是原子性的,這個會編譯成count = count +1; 所以會出現多線程訪問沖突問題。volatile雖然可以保證多線程對修改可見,但代碼中用到了
count++, 主要是count++不是原子性操作,這個會編譯成count = count +1,其實是做了3個步驟,一個是讀取,修改,寫入 。所以會出現多線程訪問沖突問題
總而言之,如果操作是原子性的,也就是說轉為匯編語句是一句,不可分割的,那么無論怎樣都是線程安全的,否則,不管加沒加volatile,都是線程不安全的!
解決方案:i前面加上AtomicInteger