Java內存模型


1、基本概念
  • 程序:代碼,是為了完成某一個任務,代碼序列(靜態的概念)
  • 進程:程序在某些數據上的一次運行(動態的概念)
  • 線程:一個進程可能包含一個或多個線程(占有資源的獨立單元)
 
2、JVM與線程
    JVM什么時候啟動? 
    類被調用是時啟動JVM,JVM線程 啟動 其他線程(mian...)
 
3、JVM內存模型
  • 方法區:類信息,常量,static變量,JIT (利用反射加載類) 
  • 堆:實例對象       
  • VM stack:Java方法在運行時的內存模型
  • native method stack:Java本地方法運行的內存模型,與VM stack基本一樣  
  • 程序計數器:存儲執行下一條指令的地址
  • 方法區、堆是所有線程共享的,虛擬機棧、本地方法棧、程序計數器都是線程私有的 
 
 
VM stack圖解:
 
 
4、Java內存模型 JMM(Java Memory Model)(這是一個規范,抽象的模型)
 
  • 主內存:共享的信息
  • 工作內存:私有信息,基本數據類型,直接分配到工作內存;引用數據類型:引用的地址存放在工作內存,引用的對象存放在堆中
  • 工作方式:
    • 線程修改私有數據:直接在工作空間修改
    • 線程修改共享數據:把數據復制到工作空間中去,在工作空間中修改,修改完成以后,刷新內存中的數據
 
5、硬件內存架構與JMM
        1. 硬件架構
    
  • CPU緩存的一致性問題:並發處理的不同步
  • 解決方案
    • 總線枷鎖,降低CPU吞吐量
    • 緩存上的一致性協議(MESI)
      • 當CPU在CACHE中操作數據時,如果該數據是共享變量,數據在CACHE讀到寄存器中,進行新修改,並更新內存數據
      • CaCHE  LINE置無效,其他的CPU就從內存中讀數據
 
6、Java內存模型的必要性
Java內存模型的作用:規范內存數據和工作空間數據的交互
 
7、並發編程的三個重要特性
  • 原子性:不可分割
  • 可見性:線程只能操作自己工作空間內的數據
  • 有序性:程序中的順序不一定就是執行的順序
    • 編譯重排序
    • 指令重排序
    • 重排目的:提高運行效率  
    • as-if-seria:單線程中重排后不影響執行的結果,多線程
    • happens-before:
 
8、JMM對三個特征的保證
  • JMM與原子性
    • X=10  寫   原子性   如果是私有數據具有原子性,如果是共享數據沒原子性
    • Y=X    沒有原子性
      • 把數據X讀到工作空間(原子性)
      • 把X的值寫到Y(原子性)
    • i++     沒有原子性
      • 讀取i的值到工作空間
      • i+1
      • 刷新結果到內存
    • z=z+1    沒有原子性
    • 結論:多個原子性的操作合並到一個沒有原子性
    • 解決方法:synchronized、JUC Lock的lock
  • JMM與可見性
    • volatile:在JMM模型上實現MESI的協議
    • synchronized:加鎖
    • JUC:Lock的lock
  • JMM與有序性
    • volatile
    • synchronized
    • happens-before原則
      • 程序次序原則
      • 鎖定原則:后一次加鎖必須要等前一次解鎖
      • volatile原則
      • 傳遞原則
 
下次為大家詳解synchronized、volatile等原則


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM