Java記憶體模型的基礎
之前我提出過一個這麼的概念來簡化大家對執行緒的理解:
無論我們在編碼層做多麼複雜的業務處理,對於計算機而言就只有三個工作要做:
- 在記憶體中讀取資料
- CPU運算資料
- 將運算結果寫回記憶體
一個執行緒任務在計算機的底層中實際上完成的任務只有上面這三種,我們可以透過一個簡單計算機模型來描述上面的關係:
這裡我們的執行緒負責去主記憶體中獲取資料然後交給CPU處理,在CPU處理結束後又將資料送還給主記憶體。那麼在這個過程中,JMM(JAVA Memory Model 譯:JAVA記憶體模型)是如何設計執行緒的記憶體模型來實現資料搬運處理的能力呢?這裡我們可以看下面的這個JMM基礎記憶體模型:
這裡如果執行緒A想要完成 i=1 的這個賦值操作,就需要經歷下面的這個過程:
- 執行緒A在主記憶體中讀取 int i,將int i複製一份儲存到執行緒A的私有記憶體空間
- 執行緒A將一個新的值0賦予 i ,然後將更新後的i寫回到記憶體中
雖然上面的流程看起來很簡單,但是如果在併發的情況下是會存在問題的:
- 執行緒A 在主記憶體中讀取 int i,將int i複製一份儲存到執行緒A的私有記憶體空間
- 執行緒B 想要執行 i = i+1 的指令,此時執行緒A還沒有還沒有將更新後的值寫回主記憶體
- 執行緒B 讀到 int i = 0 並將讀到的共享變數複製寫入自己的私有記憶體空間
- 執行緒A 完成 i=1 的賦值並將結果寫回到主記憶體
- 執行緒B 此時拿到自己私有記憶體變數 i=0 來計算 i=i+1 並得到結果1
- 執行緒B 將得到的結果寫回主記憶體
我們期望的運算結果應該是i=2 ,但是由於執行緒B沒有及時能夠讀到執行緒A更新的變數值,所以出現了我們讀到i=1的結果,這無疑是執行緒不安全的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69979681/viewspace-2743637/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java基礎:記憶體模型Java記憶體模型
- Java記憶體模型_基礎Java記憶體模型
- Java 併發基礎之記憶體模型Java記憶體模型
- Java記憶體模型深度解析:基礎部分Java記憶體模型
- 深入理解Java記憶體模型(一)——基礎Java記憶體模型
- java基礎-記憶體分配Java記憶體
- 【Java基礎】實體記憶體&虛擬記憶體Java記憶體
- Java的記憶體模型Java記憶體模型
- Java基礎知識_記憶體Java記憶體
- Java 記憶體模型Java記憶體模型
- Java記憶體模型Java記憶體模型
- [Java基礎]記憶體洩漏和記憶體溢位Java記憶體溢位
- JVM記憶體結構、Java記憶體模型和Java物件模型JVM記憶體Java模型物件
- java基礎:記憶體分配機制Java記憶體
- Java記憶體區域和記憶體模型Java記憶體模型
- Java記憶體模型FAQ(一) 什麼是記憶體模型Java記憶體模型
- JMM Java 記憶體模型Java記憶體模型
- Java記憶體模型-(1)Java記憶體模型
- Java物件記憶體模型Java物件記憶體模型
- 探索Java記憶體模型Java記憶體模型
- 理解Java記憶體模型Java記憶體模型
- 《Java工程師成神之路-基礎篇》JVM——Java記憶體模型(已完結)Java工程師JVM記憶體模型
- java記憶體模型的實現Java記憶體模型
- Java記憶體模型是什麼,為什麼要有Java記憶體模型,Java記憶體模型解決了什麼問題?Java記憶體模型
- 淺談JVM記憶體結構 和 Java記憶體模型 和 Java物件模型JVM記憶體Java模型物件
- Java記憶體模型 - 簡介Java記憶體模型
- Java記憶體模型簡介Java記憶體模型
- 淺談Java記憶體模型Java記憶體模型
- java記憶體模型——重排序Java記憶體模型排序
- Java記憶體模型之前奏Java記憶體模型
- java記憶體垃圾回收模型Java記憶體模型
- Java記憶體模型_重排序Java記憶體模型排序
- Java記憶體模型_volatileJava記憶體模型
- 同步和Java記憶體模型Java記憶體模型
- Java記憶體模型FAQ(五)舊的記憶體模型有什麼問題?Java記憶體模型
- 你瞭解Java記憶體模型麼(Java7、8、9記憶體模型的區別)Java記憶體模型
- Java基礎專題 Jvm記憶體劃分JavaJVM記憶體
- Java併發中的記憶體模型Java記憶體模型