最贊回答 / 是麥兜啊
while循環內判斷的是所有的子線程是否都運行完了,如果是的話,繼續下面的打印操作。如果不用synchronized或不加鎖,程序運行時,有時候getNumber獲得的值小于500,是因為volatile定義的變量不能保證原子性,所以會出現兩個線程同時寫number時,number只增加了1,沒有增加2,所以影響到number變量最終的值不是500,而是499或498了。
2017-07-07
已采納回答 / 憂傷的帥哥
不管怎么重排序(編譯器和處理器為了提高并行度),(單線程)程序的執行結果不能被改變。java內存中的變量都有指針引用,上下文引用成鏈,這個鏈是不會被打亂重排序的,只有沒有數據依賴關系的代碼,才會被沖排序,所以在單線程內部重排序不會改變程序運行結果,這就是as-if-serial
2017-06-22