聽說這道JAVA基礎題,面試中給出正確答案的人數不到32%

先拋出問題 - 「這段程序的運行結果是什麼」java

聽說這道JAVA基礎題,面試中給出正確答案的人數不到32%
題目- 所有代碼,仔細審題哦
期待的運行結果:
i=1
i=2
i=4
i=3
...
..
i=100
無序輸出 i=1到1=100。惋惜,這是錯誤的答案。面試

實際運行結果中,可能出現部分值沒有被輸出,部分值被重複輸出,以下:工具

i = 2
i = 2
i = 3
...
i = 100
這裏僅列舉了一種,你能夠本身嘗試運行幾回。
緣由分析學習

代碼中 i 變量,是一個Integer對象,當代碼中兩個線程執行 i++時,線程

實際運行時的 i++ 的實現邏輯是這樣的:對象

i = Integer.valueOf(i.intValue() + 1);
而Integer.valueOf每次是返回一個新的Integer對象,因此,咱們的synchronized實際上沒有起到你預想中的效果。源碼

我是如何發現這個實現內幕的呢?虛擬機

底層原理分析編譯

一、 分析編譯後的MyRunnable.class文件,發現 i++ 在虛擬機中的執行原理。class

經過jdk自帶的javap命令工具,對 MyRunnable.class 進行分析

javap -v MyRunnable.class
能夠看到輸出內容中(以下圖),JVM執行 i++ 的內部邏輯。

聽說這道JAVA基礎題,面試中給出正確答案的人數不到32%
使用javap命令分析class的結果截圖
這個邏輯,經過代碼表達出來就是這句「i = Integer.valueOf(i.intValue() + 1);」

二、 查看Integer的源碼,發現 Integer.valueOf 每次都是新對象。

/* Integer源碼取自jdk1.8 /
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
寫在最後

真相大白了,你懂了嘛? 能夠分享出去讓更多人知道。

在學習JAVA的過程當中,我真正體會到了系統性學習的重要性,如今我每月都有學習目標,再也不像之前那樣,看到什麼就學什麼了,這樣作讓我明顯感受到了本身的提高。

相關文章
相關標籤/搜索