相似物理上的計算機系統,Java虛擬機規範中也定義了一種Java內存模型,即Java Memory Model(JMM),
來屏蔽掉各類硬件和操做系統的內存訪問差別,以實現讓Java程序在各類平臺下都能達到一致的併發效果。html
如今最新的Java內存模型規範是JSR-133,即Java內存模型與線程規範,這套規範包含:java
理解內存模型對Java的併發編程有很大的幫助。編程
JMM決定一個線程對共享變量的寫入什麼時候對另外一個線程可見。
定義了線程和主內存之間的抽象關係:線程之間的共享變量存儲在主內存(main memory)中,每一個線程都有一個私有的本地內存(local memory),本地內存中存儲了該線程以讀/寫共享變量的副本。
本地內存是一個抽象概念,並不真實存在,涵蓋了緩存,寫緩衝區,寄存器以及其餘的硬件和編譯器優化。數組
(1)主內存和本地內存
主內存即main memory。在java中,實例域、靜態域和數組元素是線程之間共享的數據,它們存儲在主內存中。
本地內存即local memory。 局部變量,方法定義參數 和 異常處理器參數是不會在線程之間共享的,它們存儲在線程的本地內存中。
(2)原子性
是指一個操做是按原子的方式執行的。要麼該操做不被執行;要麼以原子方式執行,即執行過程當中不會被其它線程中斷。緩存
重排序是指「編譯器和處理器」爲了提升性能,而在程序執行時會對程序進行的重排序。
重排序分爲——「編譯器」和「處理器」兩個方面,而「處理器」重排序又包括「指令級重排序」和「內存的重排序」。
關於重排序,咱們須要理解它的思想:爲了提升程序的併發度,從而提升性能!可是對於多線程程序,重排序可能會致使程序執行的結果不是咱們須要的結果!所以,就須要咱們經過「volatile,synchronize,鎖等方式」做出正確的實現同步。多線程
內存屏障包括LoadLoad, LoadStore, StoreLoad, StoreStore共4種內存屏障。內存屏障是與相應的內存重排序相對應的。
經過內存屏障能夠禁止特定類型處理器的重排序,從而讓程序按咱們預想的流程去執行。併發
順序一致性內存模型是理想化的內存模型。有如下規則:
(1)一個線程中的全部操做必須按照程序的順序來執行。
(2)全部線程都只能看到一個單一的操做執行順序。在順序一致性內存模型中,每一個操做都必須原子執行且馬上對全部線程可見。app
鎖是java併發編程中最重要的同步機制。
(1)鎖的內存語義:
線程A釋放一個鎖,實質上是線程A向接下來將要獲取這個鎖的某個線程發出了(線程A對共享變量所作修改的)消息。
線程B獲取一個鎖,實質上是線程B接收了以前某個線程發出的(在釋放這個鎖以前對共享變量所作修改的)消息。
線程A釋放鎖,隨後線程B獲取這個鎖,這個過程實質上是線程A經過主內存向線程B發送消息。函數
(2)JMM如何實現鎖
公平鎖是經過「volatile」實現同步的。公平鎖在釋放鎖的最後寫volatile變量state;在獲取鎖時首先讀這個volatile變量。根據volatile的happens-before規則,釋放鎖的線程在寫volatile變量以前可見的共享變量,在獲取鎖的線程讀取同一個volatile變量後將當即變的對獲取鎖的線程可見。post
非公平鎖經過CAS實現的,CAS就是compare and swap。CAS實際上調用的JNI函數,也就是CAS依賴於本地實現。以Intel來講,對於CAS的JNI實現函數,它保證:
禁止該CAS以前和以後的讀和寫指令重排序。
把寫緩衝區中的全部數據刷新到內存中。
對於基本類型的final域,編譯器和處理器要遵照兩個重排序規則:
(1)final寫:「構造函數內對一個final域的寫入」,與「隨後把這個被構造對象的引用賦值給一個引用變量」,這兩個操做之間不能重排序。
(2)final讀:「初次讀一個包含final域的對象的引用」,與「隨後初次讀對象的final域」,這兩個操做之間不能重排序。
對於引用類型的final域,除上面兩條以外,還有一條規則:
(3)final寫:在「構造函數內對一個final引用的對象的成員域的寫入」,與「隨後在構造函數外把這個被構造對象的引用賦值給一個引用變量」,這兩個操做之間不能重排序。
寫final域的重排序規則能夠確保在引用變量爲任意線程可見以前,該引用變量指向的對象的final域已經在構造函數中被正確初始化過了。其實要獲得這個效果,還須要一個保證:在構造函數內部,不能讓這個被構造對象的引用爲其餘線程可見,也就是對象引用不能在構造函數中「逸出」。
JMM經過「內存屏障」實現final,在final域的寫以後,構造函數return以前,插入一個StoreStore障屏。在讀final域的操做前面插入一個LoadLoad屏障。
轉:http://www.cnblogs.com/binyue/p/4311232.html