線程的內存結構圖
1.Java內存模型的主要目標是定義程序中各個變量的訪問規則。此處的變量與Java編程時所說的變量不一樣,指包括了實例字段、靜態字段和構成數組對象的元素,但是不包括局部變量與方法參數,因為它們是線程私有的,不會被共享。
2.Java內存模型中規定了所有的變量都存儲在主內存中,每條線程還有自己的虛擬內存。線程的虛擬內存中保存了該線程使用到的變量到主內存副本拷貝。線程對變量的所有操作(讀取、賦值)都必須在自己的虛擬內存中進行,而不能直接讀寫主內存中的變量。不同線程之間無法直接訪問對方虛擬內存中的變量,線程間變量值的傳遞均需要在主內存來完成。
二、內存間交互操作
關於主內存與工作內存之間的具體交互協議,即一個變量如何從主內存拷貝到工作內存、如何從工作內存同步到主內存之間的實現細節,Java內存模型定義了以下八種操作來完成:
如果要把一個變量從主內存中復制到工作內存,就需要按順尋地執行read和load操作,如果把變量從工作內存中同步回主內存中,就要按順序地執行store和write操作。
三、多線程的三個特性
1、原子性(Atomicity)
原子性是指在一個操作中就是cpu不可以在中途暫停然後再調度,既不被中斷操作,要不執行完成,要不就不執行。和事物的原子性一致。
2、可見性(Visibility)
可見性就是指當一個線程修改了線程共享變量的值,其它線程能夠立即得知這個修改。從多線程內存間的交互我們知道,共享數據都是從主內存拷貝副本在虛擬內存操作,最後寫入主內存,就會造成線程不安全。
如果在變量讀取前從主內存刷新變量值,可以利用這種依賴主內存作為傳遞媒介的方法來實現可見性。
3、有序性(Ordering)
線程的有序性指兩個方面:如果在本線程內觀察,所有操作都是有序的;如果在一個線程中觀察另一個線程,所有操作都是無序的。前半句是指“線程內表現為串行語義”,後半句是指“指令重排序”現象和“工作內存中主內存同步延遲”現象。
四、同步機制
介紹volatile、synchronized、final