java內存模型是java虛擬機規範中定義的關於java程序中變量的訪問規則,主要目標是爲了屏蔽不一樣硬件和操做系統對於變量訪問方式的差別,在java虛擬機層面保持相同的變量訪問的語義。java
java內存模型把內存分爲主內存和工做內存,主內存是虛擬機內存的一部分能夠認爲是Java堆,工做內存是java虛擬機中每一個線程本身的工做內存,能夠認爲是線程的棧空間。併發
java虛擬機爲工做內存和主內存的交互定義8種操做,8種操做之間要遵循必定的規則。app
java內存模型主要圍繞着併發過程當中,原子性、可見性、有序性三個特徵來設計的。操作系統
原子性主要經過是經過原子性的變量操做和鎖機制來完成的。線程
可見性主要經過volatile、synchronized和final來實現。設計
有序性主要是經過volatile和synchronized來保證,java語言中也自帶了先行發生原則,也叫happens-before原則。對象
happens-before原則主要包括程序次序原則、管程鎖定規則、volatile變量規則、線程啓動規則、線程終止規則、線程中斷規則、對象終結規則、傳遞性。內存