欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

原子操作CAS

程序员文章站 2022-03-08 17:52:09
...

一、原子操作
原子操作(atomic operation)不需要 synchronized。原子操作指的是不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch(切换到另一个线程)。

二、什么是CAS
CAScompare and swap的缩写,即比较交换CAS是乐观锁。在java中锁分为乐观锁悲观锁悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,性能悲观锁有很大的提高。

三、CAS算法思想
指令级别保证这是一个原子操作:CAS其底层是通过CPU1条指令来完成3个步骤,因此其本身是一个原子性操作,不存在其执行某一个步骤的时候而被中断的可能。

CAS(v, e , n)
    - v : 表示要更新的变量
    - e : 表示变量的预期值
    - n : 表示变量的新值

当且仅当 v 的实际值等于 e 值时, 才会将 v 的值设为 n 
如果 v 值和 e 值不同,则说明已经有其他线程做了更新,那么当前线程什么都不做,即更新失败。
CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。
当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。
失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。

四、CAS的优缺点
优点

  • 并发量不是很高时CAS机制会提高效率
  • 在一般情况下,性能优先于锁的使用

缺点

  • CPU消耗大,CAS线程会不停自旋,如果并发量大的话,将会不停重试,还不释放CPU,极端情况下会耗光资源。
  • 只能保证某个变量的原子操作(这里可以用并发包里面的原子更新类AtomicReference实现)
  • ABA问题 (在JAVA并发包里面AtomicStampedReference类用了版本号来解决ABA问题)。
  • 它将使调用者处理竞争问题(通过重试、回退、放弃),而在锁中能自动处理竞争问题。

五 、原子操作类
原子操作CAS
使用场景 使用原子操作代替synchronized加锁