文章目錄
- CAS是什麼
- CAS底層原理-上
-
- atomicInteger.getAndIncrement()為啥可以保證原子性
- cas底層原理-下
- cas缺點
CAS是什麼
cas:比較并交換(compareAndSet)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iMxcjN1UGN2cTYiJzY1I2NzYzX3IDOwkTMxIzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
想突破一萬五,必須要說得出底層!網際網路公司不是不招,而是招高手。
多線程,發生的原子性問題,是因為執行太快發生了覆寫,值丢失了。
看方法的源碼:
兩個參數,一個是期望值,一個是更新值,主記憶體空間中有個變量a,3個線程把a複制到了工作記憶體中,然後想要修改主記憶體中的a,肯定希望此時主記憶體中還是自己複制過來的a,這就是第一個參數,期望值,如果不是a了,就傳回false(整個流程就得重新取得主記憶體中的a的值,然後重複這個操作,直到期望值跟主記憶體中的值比對起來。),如果是a,就傳回true,并設定值。
測試代碼:
這就說明,隻有期望值和實際值一樣,才會執行指派操作,傳回true,如果實際值不滿足期望值,就會傳回false,不會指派。這就是最明顯的比較并交換。
總結:如果線程的期望值,跟實體記憶體的真實值一樣,就修改為更新的值,本次操作為true,反之,為false。
CAS底層原理-上
底層原理,兩個關鍵字:自旋鎖、unsafe類。
atomicInteger.getAndIncrement()為啥可以保證原子性
cas底層原理-下
cas缺點
- 循環時間長
6.網際網路大廠高頻面試題-cas - 隻能保證一個共享變量的原子操作 多個變量隻能加鎖了。
6.網際網路大廠高頻面試題-cas - 他會引出來ABA問題