淺談java中的 “i=i++;”
首先有一下代碼:
public class Demo{ public static void main(String []args){ int i=12; i=i++; System.out.println(i); } }
你可以試想這段代碼是多少 大多數同學可能會回答是13,然而事實并非如此,如下圖結果:
在上圖中,我首先進行了運行,可以看到結果,我們的i并不是如大多人猜測的那樣為13輸出 ,而是看上去沒有做這個自增的操作,然而這是為什么呢?
于是,就有了后面反編譯為字節碼的操作,我們利用javap 指令反編譯后可以看清楚其中發生的事情,有同學對其中的JVM指令不清楚,沒關系,我這里先普及一下本文代碼中所涉及的JVM指令;
(這里的關鍵指令碼在于main方法之后,因此只針對于下面的指令進行解釋,其之前的是虛擬機自動構建的默認構造方法的指令碼)
1.bipush: 將單字節的常量值(-128~127)推送至棧頂
2.istore: 將棧頂int型數值存入指定本地變量
3.iload: 將指定的int型本地變量推送至棧頂
4.iinc: 該指令用于對本地(局部)變量進行自增減操作。該指令第一參數為本地變量的編號,第二個參數為自增減的數量
5.getstatic 獲取指定類的靜態域,并將其值壓入棧頂(到這個位置之后就是調用靜態對象out打印的操作不再贅述,感興趣的同學可以在本文末尾附上的鏈接的去了解一下)
知道基本的幾個指令之后我們來分析上圖中關鍵指令的意思吧:
bipush 12這里是把12推至棧頂 棧里存儲了12 這個int數值
istore_1 這里是把12彈出給第二個(備注:第1個本地變量應該是this)本地變量 即i=12
iload_1 這里是把第二個本地變量(i)的值推入棧頂 此時棧頂為12
iinc 1,1 自然是i=i+1 即i++ 這個時候i=13
istore_1這里是把棧頂值彈出給本地變量i,這個時候 i又被賦值為 12
因此最終 打印出來的時候i為12。
CSDN一老哥整理的JVM指令集合,很方便查詢學習
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77226.html
摘要:在多線程的問題上面概念比較多,也需要慢慢理解,其實也在多線程的鎖的上面做了很多優化,還有互斥同步和非互斥同步,還有很多概念,什么是自旋和自適應自旋,鎖消除順便提一下,上面的字符串拼接的例子就是用到了這種優化方式,鎖粗化,我們下次再繼續分享。 在我們平常的開發工作中,或多或少的都能接觸到多線程編程或者一些并發問題,隨著操作系統和系統硬件的升級,并發編程被越來越多的運用到我們的開發中,我們...
摘要:并發設計的三大原則原子性原子性對共享變量的操作相對于其他線程是不可干擾的,即其他線程的執行只能在該原子操作完成后或開始前執行。發現兩個線程運行結束后的值為。這就是在多線程情況下要求程序執行的順序按照代碼的先后順序執行的原因之一。 并發設計的三大原則 原子性 原子性:對共享變量的操作相對于其他線程是不可干擾的,即其他線程的執行只能在該原子操作完成后或開始前執行。 通過一個小例子理解 pu...
摘要:主機架構與內存模型多任務處理器在現代計算機系統中幾乎已是一項必備的功能了。在計算機系統中,可能存在多個處理器,每個處理器都有自己的高速緩存,而他們又共享同一主內存。 計算機:輔助人腦的好工具 計算機的定義: 接受使用者輸入指令與數據, 經由中央處理器的數學與邏輯單元運算處理后,以產生或儲存成有用的信息 我們的個人電腦也是計算機的一種,,依外觀來看這家伙主要分三部分: 輸入單元:包括鍵...
摘要:由于實現了接口,它支持通過索引值去隨機訪問元素。第三種,循環遍歷。如下效率分析遍歷時,使用隨機訪問即,通過索引序號訪問效率最高,而使用迭代器的效率最低類型轉換如何實現與基本數據類型的裝換將轉換為基本的數據類型。 雖是讀書筆記,但是如轉載請注明出處 http://segmentfault.com/blog/exploring/ .. 拒絕伸手復制黨 字符串遍歷 String str...
閱讀 1203·2021-11-17 09:33
閱讀 3599·2021-09-28 09:42
閱讀 3326·2021-09-13 10:35
閱讀 2478·2021-09-06 15:00
閱讀 2438·2021-08-27 13:12
閱讀 3609·2021-07-26 23:38
閱讀 1828·2019-08-30 15:55
閱讀 539·2019-08-30 15:53