程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> java-多線程並發問題,有圖,有C幣

java-多線程並發問題,有圖,有C幣

編輯:編程綜合問答
多線程並發問題,有圖,有C幣

圖片說明

結果出現1和2 和2,2都好理解,這個1,1的情況我該怎麼理解呢??

最佳回答:


這個1,1的出現的原因分析如下:共享成員變量num++沒有加鎖處理,這個操作本質上是三行代碼的,volatile只能保證共享變量的修改立即被其它線程看見,而不能保證原子操作。
而num++就應該是一個原子操作。可能這兩個線程在同一時刻同時讀取到num=0,然後又同時num++將其設置成1了。
多線程環境下的原子操作,只能通過鎖來實現,而volatile不能保證原子操作的。
我們項目中也碰到統計操作原子性沒保證導致的偏差問題,參考:http://blog.csdn.net/wojiushiwo945you/article/details/42553845
如果你修改num++這行代碼為如下,就不會出現11了。

 synchronized(num){
     num++;
 }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved