結果出現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++;
}