java volatile解析
阿新 • • 發佈:2018-12-12
解析volatile之前需要先敘述一下cpu的記憶體機制。 cpu 的運算元和操作指令是儲存的記憶體中,在cpu計算的時候,先將資料複製一份在各自的快取記憶體中。 當設計到多核的cpu的時候,因為各自執行緒在各自cpu操作,那麼同一個記憶體的變數就在不同的cpu裡面有各自的一份快取了。從而導致資料操作就有了快取不一致的問題。 常見的快取一致性問題解決方案: 1)通過在匯流排加LOCK#鎖的方式 2)通過快取一致性協議:快取一致性協議,其實簡單來說就是一個替補協議。當CPU對一個共享變數操作寫操作的時候,它會通知其他cpu的快取是失效的,其他cpu這時候只能從主存讀取最新的變數值。注意這裡只有在寫操作的時候才會通知,失效的,也就是如果cpu在快取中變數進行資料操作的時候,其實並不會通知其他CPU。在CPU操作快取,到將變數寫到主存這個間斷來說,其他cpu還是拿到各自的快取。 下面讓我們從上面的原理來介紹volatile的原理: 可見性:所謂的可見性,就是這個共享變數發生改變了,導致其他執行緒cpu的快取失效,只能去主存讀取。 原子性:volatile沒有原子性,假如兩個形成都在cpu內對共享變數操作,我們極端想象,寫入主存的時候,另外一個執行緒已經操作完了,從而第二執行緒也將資料寫入。揪著根本原因cpu在對共享快取操作的時候,並沒有通知其他cpu的快取失效。