目录

什么是CAS

CAS的工作原理

CAS的优缺点

什么是ABA问题


 

什么是CAS

 

CAS意为比较和交换。我们先举个小例子。我们在volatile中为了保证了操作的原子性,当时引入了AtomicInteger类。使用Atomic类中的方法的底层原理就CAS。

下面这个小例子,CAS在Java中的代码中比较给定值是否符合期望值,符合就更新,不符合就不更新

CAS原理与ABA问题

点进AtomicInteger源码,发现里面有unsafe。那什么是unsafe呢?unsafe是java调用C++的native方法操作内存的标志。

CAS原理与ABA问题

我们再点进getAndIncrement方法,发现它底层调用了getAndAddInt

CAS原理与ABA问题

进入getAndAddInt才发现,这里用了一个自旋锁。原来比较和交换的逻辑写在这里。比较的是内存地址偏移的值

CAS原理与ABA问题

 

 

CAS的工作原理

 

CAS比较工作内存中的值与主内存的值, 如果这个值是期望的,就执行操作。如果不是就一直循环下去。(自旋锁)

 

 

CAS的优缺点

 

优点:

1.直接操作内存,效率非常高。 

2.保证了操作的原子性

 

缺点:

1.循环会耗费时间

2.一次性只能保证一个共享变量的原子性

3.会出现ABA问题

 

 

什么是ABA问题

 

简单来说就是有一个捣乱的线程,虽然最后写的值一样,但是两个线程从主线程那里操作的数据不一致。

CAS原理与ABA问题

CAS原理与ABA问题

我们期望的是,只要主线程的值变了就要通知其他线程,因为这种打印结果并不是真正的执行流程

CAS原理与ABA问题

解决此问题需要加上乐观锁操作,通过版本判断是否操作同一个主存的值

CAS原理与ABA问题

相关文章:

  • 2021-09-15
  • 2019-12-27
  • 2022-12-23
  • 2021-08-13
  • 2020-06-16
  • 2021-08-29
  • 2021-10-04
  • 2021-09-15
猜你喜欢
  • 2020-07-17
  • 2021-08-20
  • 2021-07-25
  • 2021-08-23
  • 2022-12-23
  • 2021-08-22
相关资源
相似解决方案