JMM

JMM概念

JMM即爲JAVA 內存模型(java memory model)。自己是一種抽象的概念,並不真實存在,它描述的是一組規則或規範,經過這組規範定義了程序中各個變量(包括實例字段,靜態字段和構成數組對象的元素)的訪問方式。是爲了屏蔽系統和硬件的差別,讓一套代碼在不一樣平臺下能到達相同的訪問結果。java

內存劃分

  • 工做內存
    對應寄存器和高速緩存
  • 主內存
    對應硬件的物理內存

線程對變量的讀取和寫入,直接在工做內存中操做,而不能直接去操做主內存中的變量。可是這樣就會出現一個問題,當一個線程修改了本身工做內存中變量,對其餘線程是不可見的,會致使線程不安全的問題。數組

模型特徵

  1. 原子性 - 保證指令不會受到線程上下文切換的影響

被synchronized關鍵字或其餘鎖包裹起來的操做也能夠認爲是原子的。從一個線程觀察另一個線程的時候,看到的都是一個個原子性的操做。緩存

2.可見性 - 保證指令不會受 cpu 緩存的影響安全

每一個工做線程都有本身的工做內存,因此當某個線程修改完某個變量以後,在其餘的線程中,未必能觀察到該變量已經被修改。volatile關鍵字要求被修改以後的變量要求當即更新到主內存,每次使用前從主內存處進行讀取。所以volatile能夠保證可見性。除了volatile之外,synchronized和final也能實現可見性。synchronized保證unlock以前必須先把變量刷新回主內存。final修飾的字段在構造器中一旦完成初始化,而且構造器沒有this逸出,那麼其餘線程就能看到final字段的值。優化

3.有序性 - 保證指令不會受 cpu 指令並行優化的影響
java的有序性跟線程相關。若是在線程內部觀察,會發現當前線程的一切操做都是有序的。若是在線程的外部來觀察的話,會發現線程的全部操做都是無序的。由於JMM的工做內存和主內存之間存在延遲,並且java會對一些指令進行從新排序。this

相關文章
相關標籤/搜索