計算機在執行程序時,每條指令都是在CPU中執行的,而執行指令過程當中,勢必會涉及到數據的讀取和寫入。java
因爲在程序運行過程當中,臨時數據是存放在主存(物理內存)中的,這時就存在一個問題,因爲CPU執行指令的速度很快,而從內存讀取和寫入數據的過程與其相比速度要慢得多,所以若是任什麼時候候對數據的操做都要經過和內存的交互來進行,會大大下降指令執行的速度。緩存
所以CPU中就有了高速緩存。當程序在運行過程當中,會將運算須要的數據從主存複製一份到CPU的高速緩存中,當CPU進行計算時就能夠直接從它的高速緩存中讀取和寫入數據,運算結束以後,再將高速緩存中的數據刷新到主存當中去。多線程
在Java虛擬機規範中試圖定義一種Java內存模型(Java Memory Model,JMM)來屏蔽各個硬件平臺和操做系統的內存訪問差別,以實現讓Java程序在各類平臺下都能達到一致的內存訪問效果。併發
JMM定義了線程和主內存之間的抽象關係:線程之間的共享變量存儲在主內存(Main Memory)中,每一個線程都有一個私有的本地內存(Local Memory),本地內存中存儲了該線程讀/寫共享變量的副本。app
若是線程A與線程B之間要通訊的話,必需要經歷下面2個步驟。優化
原子性:一個操做或多個操做,要麼所有執行而且執行過程當中不會被任何因素打斷,要麼就不執行。this
可見性:指當多個線程訪問同一個變量時,一個線程修改了這個變量的值,其餘線程可以當即看獲得修改的值操作系統
有序性:程序執行的順序按照代碼的前後順序執行。線程
指令重排序:通常來講,處理器爲了提升程序運行效率,可能會對輸入代碼進行優化,它不保證程序中各個語句的執行前後順序同代碼中的順序一致,可是它會保證程序最終執行結果和代碼順序執行的結果是一致的(順序不一致,但結果一致)。重排序過程不會影響到單線程程序的執行,卻會影響到多線程併發執行的正確性。對象
源代碼 -> 編譯器優化的重排 -> 指令並行的重排 -> 內存系統的重排 ->最終執行的指令
保證有序性的方法: