原子操作CAS

这篇具有很好参考价值的文章主要介绍了原子操作CAS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CAS

悲观锁

具有强烈的独占和排他特性。在有悲观锁的情况下,对数据进行处理,数据会处于锁定状态。前面讲到的synchronized同一时间只允许一个线程访问某块资源,其他线程处于阻塞状态,就是一个独占锁,是悲观锁中的一种。悲观锁适用于写操作比较多的场景。

乐观锁

对数据有更加宽松的加锁机制,允许多个线程同时访问对某块资源,一般通过版本号机制+CAS来实现。乐观锁适用于读操作比较多的场景。

CAS原理

原子操作CAS,开发语言
CAS目的:保证在同一时间,只有一个线程能够更新值。

CAS基本流程:

  • 读取内存(地址i)中共享变量的值A,作为旧址
  • 业务逻辑处理得到值B
  • 读取相同共享变量(地址i)的值C,作为新值
  • 比较A和C是否相等
  • 相等就修改变量(地址)的值为B
  • 不等就自旋从第一步开始即Retry-Loop实现

在这个过程中,CPU会通过总线锁定机制来保证CAS操作的原子性,即在CAS操作期间,其他线程无法访问被操作的内存地址。由CPU底层硬件保证的。

对于Retry-Loop,感觉其实和锁什么什么两样。只是这种“锁”的粒度变小了,主要是“锁”关键资源,而不是整个数据结构。

自旋锁的实现依赖于CAS(Compare and Swap)操作,这是一种硬件级别的原子操作。

实现

CAS(Compare-and-Swap)通常使用类似cmpxchg指令实现的,cmpxchg(Compare-and-Exchange)指令是一种原子操作的CPU指令。例如

unsigned long cmpxchg(void *addr, unsigned long _old, unsigned long _new)
{
	int *a = addr; //或者用volatile int a;
	if(*a == _old){
		*a = _new;
	}
	return _old;
}

cmpxchg是设置一个新值,返回旧值。返回旧值可以做一些其他的业务操作。

CAS也是设置一个新值,但是可以自定义返回一个bool量。

例如:

bool compare_and_swap (int *addr, int oldval, int newval)
{
  if ( *addr != oldval ) {
      return false;
  }
  *addr = newval;
  return true;
}

volatile

内存中value值通过volatile进行修饰,保证了该属性值的线程可见性。在多并发的情况下,一个线程的修改,可以保证到其他线程立马看到修改后的值。

ABA问题

虽然使用CAS可以实现非阻塞式的原子性操作,但是会产生ABA问题,ABA问题出现的基本流程:

  • 进程P1在共享变量中读到值为A;
  • P1被抢占了,进程P2执行;
  • P2把共享变量里的值从A改成了B,再改回到A,此时被P1抢占;
  • P1回来看到共享变量里的值没有被改变,于是继续执行;

虽然P1以为变量值没有改变,继续执行了,但是这个会引发一些潜在的问题。ABA问题最容易发生在lock free的算法中的,CAS首当其冲,因为CAS判断的是指针的地址。如果这个地址被重用了呢,问题就很大了(地址被重用是很经常发生的,一个内存分配后释放了,再分配,很有可能还是原来的地址)。

ABA问题的解决思路就是使用版本号:在变量前面追加上版本号,每次变量更新的时候把版本号加1,那么A->B->A就会变成1A->2B->3A。文章来源地址https://www.toymoban.com/news/detail-533727.html

到了这里,关于原子操作CAS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java的CAS操作

    技术是为了解决问题而生的,通过 CAS 我们可以以无锁的方式,保证对共享数据进行 “读取 - 修改 - 写回” 操作序列的正确性。 CAS 是乐观锁设计思想的实现。CAS 的思想是:在“读取 - 修改 - 写回”操作序列中,先读取并修改数据,写回数据前先判断读取数据后的这段时间内

    2024年02月05日
    浏览(41)
  • 【Java基础】CAS (Compare And Swap) 操作

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 我们继续总结学习 Java基础知识 ,温故知新。 CAS其实就是Compare And Swap的一个缩写,顾名思义就是比较并交换,

    2024年02月13日
    浏览(50)
  • THRUST:一个开源的、面向异构系统的并行编程语言:编程模型主要包括:数据并行性、任务并行性、内存管理、内存访问控制、原子操作、同步机制、错误处理机制、混合编程模型、运行时系统等

    作者:禅与计算机程序设计艺术 https://github.com/NVIDIA/thrust 2021年8月,当代科技巨头Facebook宣布其开发了名为THRUST的高性能计算语言,可用于在设备、集群和云环境中进行并行计算。它具有“易于学习”、“简单易用”等特征,正在逐步取代C++、CUDA、OpenCL等传统编程模型,成为

    2024年02月07日
    浏览(48)
  • 【正点原子STM32】C语言重点知识(配置MDK支持C99、位操作清零置一、带参数的宏定义、头文件的条件编译和代码条件编译、关键字、结构体指针、代码规范)

    一、stdint.h简介 配置MDK支持C99 二、位操作 如何给寄存器某个位赋值(清零置一) 三、宏定义 带参数的宏定义 四、条件编译 头文件的条件编译和代码条件编译 五、extern声明 六、类型别名(typedef) 类型别名应用 七、结构体 应用举例(定义使用) 应用举例(ST源码,使用类型

    2024年02月19日
    浏览(38)
  • 6.3 C++11 原子操作与原子类型

    在C++中,一个全局数据在多个线程中被同时使用时,如果不加任何处理,则会出现数据同步的问题。 上述例子中test函数对全局变量val进行累加,并在thread1和thread2两个线程中分别处理test函数。得到的结果如下: val的值并不是期望的20000000,这是因为val++操作不是原子操作导致

    2024年02月04日
    浏览(26)
  • AXI之原子操作

    原子 ,可以认为是物质组成的最小单位,当然,现在科学表明,比原子小的还有质子和中子。但是这里我们还将原子作为最小单位来理解,那么原子就是不可分割的,因此原子操作就可以理解为不可分割的操作。 AXI的原子操作包括exclusive和lock两种,不管是exclusive还是lock操作

    2024年02月10日
    浏览(32)
  • 并发编程08:原子操作类

    Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 AtomicInteger :整型原子类 At

    2024年02月04日
    浏览(35)
  • 原子操作的原理和实现

    目录 相关术语 处理器如何实现原子操作 Java如何实现原子操作 循环CAS实现原子操作 使用锁机制实现原子操作 原子操作是指一个或者多个不可再分割的操作。这些操作的执行顺序不能被打乱。 缓存行 :缓存的最小操作单位 (面试题、重点)比较并且交换(CAS) :CAS操作(

    2024年02月10日
    浏览(26)
  • 单点登陆(SSO)基于CAS实现前后端分离的SSO系统开发「IDP发起」

    关于其他前端常见登录实现+单点登录方案,请见「前端常见登录实现方案 + 单点登录方案 」 单点登录(SSO),英文全称为 Single Sign On。 SSO 是指在多个应用系统中,用户只需要登录一次,就可以访问所有相互信任的应用系统。 一般同域的SSO,用共享session就可以实现了,常见

    2024年01月25日
    浏览(47)
  • 原子操作:并发编程的守护者

    并发编程的守护者在多线程或者并发编程中,我们经常需要处理一些共享资源,这时候就需要保证这些共享资源的操作是线程安全的。而原子操作就是一种能够保证线程安全的重要手段。本文将详细介绍原子操作的定义、重要性、实现原理以及应用场景。 原子操作可以被视为

    2024年01月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包