![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iMwkDM3QzMiN2Y5UWMmdjNxYzX5ITMwcTM0EzLcBTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
1.volatile關鍵字與記憶體可見性
主線程沒有更新緩存資料的時間,是以記憶體裡的改動同步不過來
一直讀的的緩存裡的資料,記憶體的資料被寫了還是讀不到
同步鎖可以解決,但是效率低
volatile:多個線程共享記憶體資料,保證記憶體中的資料是可見的。使用記憶體障礙,保證從主存拿資料
volaile修飾以後,jvm不能重排序了,相較于synchronize輕量級,但是
- 沒有互斥性
- 不能保證變量的原子性(不可分割)
2.原子變量與CAS算法
i++ 讀改寫三步,可能保證記憶體可見性,但是寫記憶體同步資料,無法互斥,會有重複操作污染資料。i++操作被分割開來,沒有原子性了
同時寫記憶體,兩條線一樣的值同時發生改變成一樣的,後寫的覆寫了先寫的