關於i++引出的線程不安全性的分析以及解決措施


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM