1. 程式人生 > >java 多執行緒併發實質

java 多執行緒併發實質

首先我們都知道多執行緒在獲取共享資源時,往往會出現意想不到的結果,這是為什麼呢?執行緒獲取共享資源的過程如下圖:

首先我們需要了解jvm記憶體結構,在這裡不過多說明,由上圖我們可以知道,在jvm記憶體中分為獨立記憶體和共享記憶體,獨立記憶體是我們每個執行緒獨有的資訊,而共享記憶體就是我們每個執行緒都可以訪問的資料,由於執行緒在獲取共享資料的時候是一個過程,有左部分圖我們可以知道,首先我們獲取共享資料讀取到每個執行緒的快取空間,然後進行載入讀取賦值寫入同步等操作,在多執行緒併發訪問時我們如果一個執行緒獲取了堆記憶體中的資料,此時其他執行緒也訪問此共享資料,我們第一個執行緒資料還沒有修改更新到堆記憶體中,那麼第二個執行緒此時讀取資料就是髒資料。我們如果加上了Synchronizer等同於把我們執行過程作為一個整體,直接讀取堆記憶體資料不在讀取快取,這樣我們就可以實時獲取最新資料,那麼volatile怎麼回事呢?它是直接讀取堆記憶體資料,也就是我們常說的可見性,但是他並沒有處理我們執行緒獲取的原子性。