理解volatile和CAS配合使用原理

volatile關鍵字 主要是讓被修飾的對象能夠在內存中及時的可見,修改後及時傳遞到各個線程的本地內存中。

舉一個例子最清晰,A和B線程同時去操作一個 int值 都去加1

如下圖:最開始兩個線程都從cpu的內存空間中去拿到count的值放到自己的本地內存中

如果不是使用關鍵字volatile 可能導致如果A線程先執行完後把count值修改成了1並且刷新到了主內存空間,B線程再執行的時候本地內存中的count值還是0,還是拿到0去加1,最終的結果就是count的值還是爲1,但是其實,該爲2的。

如果使用了關鍵字 volatile 當A線程修改了count值爲1後並刷新到了主的內存空間,這時候B線程強制去主內存取count值,這個時候B執行再執行的時候就會是在1的基礎上再加1 變成2.

總結:加volatile關鍵字:強制每個線程都去主內存中取值。不加volatile:去本地內存取自己的

注意我之前很困惑的地方就是 既然內存可見了爲什麼還是會出現 兩個線程都執行後出現最後的結果還是爲1的情況。其實內存可見不保證原子性

↵因爲A和B線程如果是先後執行這裏的先後是指,相隔時間稍等大一點的那種,比如一秒。這種情況如果只使用volatile可以實現正常的數據相加因爲這個不是併發,但是如果A和B線程同時執行的話就會出現一個問題,當其中A在拿到主內存中的0值加1時,B也已經開始拿到主內存中的0值去加1,併發就是同時去執行啥,所以這個時候還不能保證最終的結果會正確。

接下來就是CAS ,比較後再賦值,其實這個就是拿到值後先與原來主內存中的值進行比較再進行賦值,如果和原來的值一樣再把新的值賦值進去。這樣的話上述問題就能差不多解決了。

上述是我自己的想法和理解 不保證全部正確僅做參考

 

 

 

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