天天看點

Java詳解之JMMJMM:

JMM:

1、JMM是一種抽象的概念并不真實存在,它描述的是一組規則或規範,通過這組規範定義了程式中各個變量的通路方式。

2、JMM關于同步的規定:

線程解鎖前,必須把共享變量的值重新整理回主記憶體

線程加鎖前,必須讀取主記憶體的最新值到自己的工作記憶體

加鎖解鎖是同一把鎖

由于JVM運作程式的實體是線程,而每個線程建立時JVM都會為其建立一個工作記憶體,工作記憶體是每個線程的私有資料區域,而Java記憶體模型中規定所有變量都存儲在主記憶體,主記憶體是共享記憶體區域,所有線程都可以通路,但線程對變量的操作(讀取指派等)必須在自己的工作記憶體中進行,各個線程首先要将變量從主記憶體拷貝到自己的工作記憶體空間,然後對變量進行操作,操作完成後再将變量寫回主記憶體,各個線程不能直接操作主記憶體中的變量,各個線程中的工作記憶體存儲着主記憶體中的變量副本拷貝,是以不同的線程間無法通路對方的工作記憶體,線程間的通信必須依靠主記憶體來完成。

Java詳解之JMMJMM:

3、JMM對線程安全性的規範:

滿足可見性、原子性、有序性這三個規範,才能保證線程安全

線程安全性獲得保證:

       工作記憶體與主記憶體同步延遲現象導緻的可見性問題,可以使用synchronized或volatile關鍵字解決,他們都可以使一個  線程修改後的變量立即對其他線程可見。

       對于指令重排導緻的可見性問題和有序性問題,可以使用volatile關鍵字解決,因為volatile的另一個作用就是禁止指令 重排。

接下來詳細講解volatile關鍵字以及JMM規定的三種規範