多線程生成的緣由(Java內存模型與i++操做解析)

Java 內存模型


線程之間的共享變量存儲在主內存(main memory)中,每一個線程都有一個私有的本地內存(local memory),本地內存中存儲了該線程以讀/寫共享變量的副本。緩存

本地內存是JMM(Java內存模型)的一個抽象概念,並不真實存在。它涵蓋了緩存,寫 緩衝區,寄存器以及其 他的硬件和編譯器優化。Java內存模型的抽象示意圖以下圖:多線程

輸入圖片說明

i++操做實質


對於一個簡單的 i++ 操做,結合上圖1 ,會發生以下的步驟:優化

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

因此說,一個 i++操做並非原子性的。這上述的這些步驟中,可能會有其餘線程對主內存的變量進行操做,從而致使出現多線程問題。線程

相關文章
相關標籤/搜索