天天看点

6.互联网大厂高频面试题-cas

文章目录

  • CAS是什么
  • CAS底层原理-上
    • atomicInteger.getAndIncrement()为啥可以保证原子性
  • cas底层原理-下
  • cas缺点

CAS是什么

cas:比较并交换(compareAndSet)

6.互联网大厂高频面试题-cas

想突破一万五,必须要说得出底层!互联网公司不是不招,而是招高手。

6.互联网大厂高频面试题-cas

多线程,发生的原子性问题,是因为执行太快发生了覆盖,值丢失了。

看方法的源码:

6.互联网大厂高频面试题-cas

两个参数,一个是期望值,一个是更新值,主内存空间中有个变量a,3个线程把a复制到了工作内存中,然后想要修改主内存中的a,肯定希望此时主内存中还是自己复制过来的a,这就是第一个参数,期望值,如果不是a了,就返回false(整个流程就得重新取得主内存中的a的值,然后重复这个操作,直到期望值跟主内存中的值匹配起来。),如果是a,就返回true,并设置值。

测试代码:

6.互联网大厂高频面试题-cas
6.互联网大厂高频面试题-cas

这就说明,只有期望值和实际值一样,才会执行赋值操作,返回true,如果实际值不满足期望值,就会返回false,不会赋值。这就是最明显的比较并交换。

总结:如果线程的期望值,跟物理内存的真实值一样,就修改为更新的值,本次操作为true,反之,为false。

CAS底层原理-上

底层原理,两个关键字:自旋锁、unsafe类。

atomicInteger.getAndIncrement()为啥可以保证原子性

cas底层原理-下

cas缺点

  • 循环时间长
    6.互联网大厂高频面试题-cas
  • 只能保证一个共享变量的原子操作
    6.互联网大厂高频面试题-cas
    多个变量只能加锁了。
  • 他会引出来ABA问题

继续阅读