文章目录
- 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问题