Java 多線程:多線程產生的原因

包括:

一. Java 內存模型

二. i ++ 操作的實質

三. Java 多線程產生的原因

四. 總結


一. Java 內存模型

線程之間的共享變量存儲在主內存(main memory)中,每個線程都有一個私有的本地內存(local memory),本地內存中存儲了該線程以讀/寫共享變量的副本。本地內存是JMM(Java內存模型)的一個抽象概念,並不真實存在。它涵蓋了緩存,寫 緩衝區,寄存器以及其 他的硬件和編譯器優化。Java內存模型的抽象示意圖如下圖1:


圖1

二. i ++ 操作的實質

對於一個簡單的 i++ 操作,結合上圖1 ,會發生如下的步驟:

  1. read:作用於主內存中,把主內存中一個變量的值傳輸到 工作內存 中。
  2. load:作用於工作內存,把從read 操作從主內存中得到的值放入到工作內存的副本中。
  3. use:把工作內存中的該副本值傳遞給執行引擎(也就是操作數棧中)。
  4. assign:作用於工作內存,把執行引擎執行後的新值傳遞給該工作內存的變量。
  5. store:作用於工作內存,把工作內存中該變量的值傳送到 主內存中去。
  6. write:作用於主內存的變量,把store 操作 得到的值寫入到 主內存的該變量中。


三. Java 多線程產生的原因

結合 一 的Java內存模型,和 二 的 i++操作實質,可以發現,並不是每一步都需要使用到 CPU,比如說讀取 i,寫入 i 的過程中,CPU 此時就空閒下來,此時,爲了讓CPU 不空閒,則產生了 多線程的技術。

Ps:由上面的模型可以看出,假如有 A,B兩個線程 都進行 i++操作,由於上面 i++操作不是原子性的,那麼 A,B 的執行順序 會 對結果有比較大的改變。所以也就會衍生出了一系列的多線程問題的解決方案,如 lock,synchronized,volatile,threadlocal,cas 等。


四. 總結

  1. Java 內存模型有 主內存 和 工作內存之分。
  2. i++操作 可細分爲 read,load,use,assign,store,write 操作。
  3. 多線程產生原因:Java內存模型決定了 CPU 不能 完全利用,爲了充分利用CPU,所以產生了多線程技術。


參考:《深入理解Java虛擬機》P364.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章