JJava程式設計師的一段基礎邏輯程式碼!卻有很多人的結果是錯的
首先,讓我們來看看這行程式碼是什麼!

可能有很多人會認為,輸出結果就是i=1、i=2、i=3、i=4如此直到100,只可惜,這樣子的無序輸出是錯誤的。
如果不信,可以照著這個圖片中的程式碼打出來,真正的輸出結果可能會是這樣:i=2、i=3、i=4、i=4、i=5這樣子,或者相鄰兩個數打印出來的是一樣的。

如果有想要學習Java的程式員,可來我們的java技術學習扣qun哦:86327,0610裡面免費送java的視訊教程噢!為什麼會出現這樣的情況?那是因為,在程式碼中,變數i是一個integer物件,而當代碼中的兩個執行緒執行的時候,i++的實際邏輯卻是這樣的:i = Integer.valueOf(i.intValue + 1);
Integer.valueOf每次返回的時候,都是一個新的Integer物件,所以,打印出來的並不是你想要的結果。

調出class檔案,通過jdk自帶的javap命令工具,對 MyRunnable.class 進行分析,在虛擬機器中可以看著i++的執行原理。
其實這個邏輯,用一句簡短的程式碼表示出來,就是i = Integer.valueOf(i.intValue + 1);”
再看一下檢視Integer的原始碼,發現 Integer.valueOf 每次都是新物件。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);}
真相大白,程式執行的真相併不是你想想中的那樣,你想讓程式做什麼就做什麼,這其中可能含有你不知道的一些問題,這就是為什麼說Java程式設計師到了一定的地步,需要去看原始碼的原因,這能夠幫助你更好得了解程式碼的編譯機制,有利於你的職業成長。