前面已經介紹了部分java併發的內容,並且在《併發編程實戰》一書中也是將該章節放到最後纔講,可是我的認爲這一章應該放到前面講纔對,由於java內存模型是整個java併發編程的核心基礎。java
在併發編程中線程之間的數據通訊有兩種方式,一種是經過讀寫內存中的公共狀態進行顯式通訊,另外一種是經過發送和接收消息進行隱式通訊。java就是採用顯性方式進行通訊的,而例如scala語言就是採用隱性的消息傳遞方式進行通訊的(scala是基於JVM運行的,而它採用了消息傳遞方式,本人估計也是在顯性方式基礎上進行擴展的)。隱性的工做方式在編程的時候比顯性方式要簡單,但顯性的方式在靈活性和效率上應該比顯性方式要高,而且編程難度也高,因此要了解java的內存模型。編程
如今的計算機基本都是多處理器共享內存的架構,並且每一個處理器內部有本身的緩存,按期的與主內存進行數據同步。不一樣的處理器架構提供了不一樣的緩存一致性(這點在「cpu緩存一致性」專題中做過說明)協議。爲了提升效率,處理器會適當放寬一致性保證(不會保證任意時刻各個緩存與內存之間的數據都是一致的),但提供了稱爲「內存柵欄」的特殊指令進行控制。爲了使java開發人員無須關心不一樣架構上內存模型之間的差別,從而提供了本身內存模型。緩存
只要變量會被多個線程進行讀寫就會受java內存模型的影響。架構
該專題主要從三個方面進行描述:一、內存可見性;二、重排序;三、happens before規則併發