這一章節的話,主要是講一下在併發操做中常見的volatile、synchronized以及原子操做的相關知識。編程
目前看的部分主要是volatile這個關鍵字。緩存
根據Java語言規範第3版中對volatile的定義:併發
Java編程語言容許線程訪問共享變量,爲了確保共享變量能被準備和一致地更新,線程應該確保經過排他鎖單獨得到這個變量。編程語言
Java語言提供了volatile,保證了全部線程能看到共享變量最新的值。線程
在硬件層面的話,若是說一個變量使用volatile去修飾的話,JIT編譯器生成的彙編指令中會含有Lock前綴的指令。Lock前綴的指令在多核處理器下會作兩件事情排序
通常來講爲了提升處理器速度,CPU不直接和內存交互,而是將系統內存的數據讀到內部緩存再進行操做,但操做完不知道何時會寫回內存。
若是說是對聲明瞭volatile的變量進行寫操做,就會產生這條Lock前綴的指令,把緩存內的數據寫回系統內存。可是其餘處理器上的值可能仍是舊值,所以在多處理器下,會實現緩存一致性協議,每一個處理器會嗅探總線上傳播的數據檢查本身緩存是否有過時,若是過時的話,就把本身內部的緩存行設置爲無效,當須要對這個數據進行操做時,就會從新從系統內存讀取。內存
這個是比較底層層面了,若是就Java的內存模型而言,我有如下幾點理解。編譯器
Java的內存模型中,線程之間通訊是經過主內存完成的,針對同一個變量,每一個線程都會有它的一個副本。編譯
副本是在線程的局部變量表裏,在要對其進行操做,須要將放入操做棧中,若是使用了volatile關鍵字,其餘線程對這個變量進行了修改,在加載副本到操做棧以前,就會發現本地的這個副本已經失效了,以後就去主內存再讀取。從而保證了共享變量在多個線程之間的可見性,即一個線程對共享變量的修改,其餘的線程能夠及時感知到。變量
在JDK後來的更新中,volatile還增長了新的做用,禁止指令重排序,這個得看到具體後面的內容再作記錄吧~
下回再見~