Java內存模型
基本概念
1. 線程通信
線程之間以何種方式進行消息傳遞
共享內存 & 消息傳遞
2. 線程同步
程序間用于控制不同線程間操作發生相對順序的機制
java是共享內存模型】采用的是隱式通信、顯式修改
jvm定義了線程和主內存(Main Memory)之間的關系:
1) 線程之間的共享變量存儲在主內存中
2) 線程私有變量存儲在私有本地內存 Local Memory中、
本地內存是jvm的一個抽象概念、并非真實存在、涵蓋緩存、緩沖區、寄存器及其它硬件及編譯器優化
Java同步原語(synchronize volatile final)
指令重排
1. 編譯器重排
在不改變單線程語義的條件下、編譯器可以重排指令的執行順序
2. 指令重排
現代cpu采用了指令級并行技術、可以同時執行多條指令、若無數據依賴、
處理器可以改變機器指令的執行順序
3. 內存系統的重排
由于處理器采用緩存和讀寫緩沖區、使得加載和存儲操作看上去是亂序的、
可能在亂序執行
jvm 指令執行
未使用同步的程序在jvm中的執行基本無序、
1. jvm不保證單線程內的操作會按照程序代碼順序執行、臨界區指令重排
2. jvm不保證所有線程看到的執行順序一致
3. jvm不保證64位的long、double類型寫操作具有原子性