1、java記憶體模型的重要目标是定義程式中各個通路變量的通路規則,即在虛拟機中将變量存儲到記憶體,和從記憶體中取出變量的低層細節;這裡所說的變量主要包括執行個體字段,靜态字段,構成數組對象的元素不包括局部變量與方法參數;
2、java記憶體模型分為主記憶體和工作記憶體,每個線程都擁有自己的工作記憶體;java線程通過read操作從主存中讀取共享變量,再通過load操作将read讀取的變量載入工作記憶體的變量副本中,此時java線程獨占變量副本可以對變量進行use和assign(指派操作),然後通過store操作将變量的值從工作記憶體中傳送到主存中,最後通過write操作将store操作傳過來的變量的值寫入主記憶體的變量中。java記憶體模型規定read和load,store和write的操作不能單獨出現,即不允許出現從主記憶體中讀取而工作記憶體不接受或者從工作記憶體中執行回寫而主記憶體不接受這樣的情況;

3、如果對一個變量進行lock操作,那麼會清空工作記憶體中此變量的值,在執行引擎使用這個變量前,需要重新執行load或assign操作初始化變量的值,對一個變量執行unlock操作之前必須先把變量的值回寫到主記憶體中;
4、volatile型變量的特殊規則
一個變量定義為volatile後,它具有兩種特性:1)保證所有線程對該變量的可見性,即當一個線程改變了該變量的值,另一個線程能立馬得到該變量的新值;對于普通變量要保證可見性,線程必須在主存中通信,即一個線程改變普通變量的值,store和write操作回寫到主存然後其它線程通過read和load操作在主存中讀取這個普通變量的值;2)、禁止指令重排序,編譯後的結果顯示對volatile變量多執行了一個lock add1 $0x0的空操作,這個操作相當于一個記憶體屏障,使重排序時不能把後面的指令重排到記憶體屏障之前,通過lock操作使得本CPU的Cache寫入記憶體,使得别的CPU無效化器Cache,這個操作相當于對Cache中的變量作了一次java記憶體模型中的store和write操作,進而保證對volatile變量的操作對其他CPU立即可見;在工作記憶體中每次使用volatile變量時,都必須要先從主記憶體中重新整理最新的值,用于保證看見其他線程對volatile變量的修改;
5、先行發生原則(happens-before)
java記憶體模型中先行發生原則指的是:一個操作先行發生在另一個操作前面,前一個操作産生的影響能被後一個操作觀察到;它是判斷資料是否存在競争,線程是否安全的主要依據;