1、主存儲器與工做存儲器
JMM 分爲主存儲器(main memory)和工做存儲器(working memory)兩種。git
主存儲器(main memory):
類的實例所存在的區域(堆),main memory爲全部的線程所共享(棧)。github
工做存儲器(working memory):
每一個線程各自獨立所擁有的做業區,在working memory中,存有main memory中的部分拷貝,稱之爲工做拷貝(working copy)。後端
2、字段的使用
2.1 字段的引用
線程沒法直接對主存儲器進行操做,當線程須要引用實例的字段的值時,會將字段值從主存儲器拷貝到工做存儲器上(read->load)。
當線程再次須要引用相同的字段時,可能直接使用剛纔的工做拷貝(use),也可能從新從主存儲器獲取(read->load->use)。
具體會出現哪一種狀況,由JVM決定。併發
2.2 字段的賦值
因爲線程沒法直接對主存儲器進行操做,因此也就沒法直接將值指定給字段。
當線程欲將值指定給字段時,會一次將值指定給位於工做存儲器上的工做拷貝(assign),指定完成後,工做拷貝的內容便會複製到主存儲器(store->write),至於什麼時候進行復制,由JVM決定。
所以,當線程反覆對一個實例的字段進行賦值時,可能只會對工做拷貝進行指定(assign),此時只有指定的最後結果會在某個時刻拷貝到主存儲器(store-write);也可能在每次指定時,都進行拷貝到主存儲器的操做(assign->store->write)。ide
3、線程的原子操做
Java定義了線程的六種原子操做:線程
read
負責從主存儲器(main memory)拷貝到工做存儲器(working memory)
write
與上述相反,負責從工做存儲器(working memory)拷貝到主存儲器(main memory)
use
表示線程引用工做存儲器(working memory)的值
assign
表示線程將值指定給工做存儲器(working memory)
lock
表示線程取得鎖定
unlock
表示線程解除鎖定get