1. 程式人生 > >i++為什麼不是原子操作

i++為什麼不是原子操作

寫一個簡單的例子:

我們直接看編譯後的java位元組碼

發現 i++ 對應的 java 位元組碼 為innc 1,1(已經圈出來),這是什麼意思呢,意思是把變數1的值增加1,這裡變數1就是i。

還發現,為什麼程式碼號是從0開始,3結束,是不是發現少了兩行?沒錯,就是少了兩行,iinc 命令其實是三步,佔了三行(單獨佔一行的為原子操作),也就是i++其實執行了三步。

繼續深入探討,這三步是哪三步呢?

1、讀記憶體到暫存器;2、在暫存器中自增;3、寫回記憶體。

記憶體就像是一個筆記本,我們只能讀或者寫,不能進行運算,我們只能用大腦思考後,在往筆記本上寫。

同樣的,對計算機來說記憶體只能讀或者寫,加法運算只能通過cpu來實現,下面來類比說明:

  1. 計算機將記憶體中的變數值讀入cpu的暫存器--------(人看到-筆記本上的i 的值 ,把這個值寫入 大腦的臨時記憶區)
  2. cpu 對其 + 1運算並運算後的值放入暫存器-------- (大腦對 這個 值進行加一運算,把這個值寫入大腦的臨時記憶區)
  3. 把這個值寫入記憶體--------(把這個值寫到筆記本上)

這裡也類比說明了為什麼cpu的1級快取讀寫的時候比從記憶體中讀快。

若繼續深入探討,這三步究竟做了設呢麼事情,那就需要學習硬體知識了,這裡不做深究,有興趣的同學問度娘。(再細研究,比如第一步計算機怎樣將記憶體中的變數值讀入cpu的暫存器,就如同研究大腦怎麼看到筆記本上的影象把他轉化為數字,超出了我的知識領域了~)

點選這裡檢視博主其他部落格