CAS(cpu 硬体同步原语(compare and swap))

生活百科 2023-01-26 08:57生活百科www.aizhengw.cn

CAS(cpu 硬体同步原语(compare and swap))

基本介绍

  • 中文名cpu 硬体同步原语
  • 外文名compare and swap
  • 所属类型电脑语言
  • 运算元V,A,B
支持并发的第一个处理器提供原子的测试并设定操作,通常在单位上运行这项操作。现在的处理器(包括 Intel 和 Sparc 处理器)使用的最通用的方法是实现名为 比较并转换或 CAS 的原语。(在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。PowerPC 处理器有一对名为“载入并保留”和“条件存储”的指令,它们实现相同的目地;MIPS 与 PowerPC 处理器相似,除了第一个指令称为“载入连结”。)
CAS 操作包含三个运算元 —— 记忆体位置(V)、预期原值(A)和新值(B)。如果记忆体位置的值与预期原值相匹配,那幺处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前值。)CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”
通常将 CAS 用于同步的方式是从地址 V 读取值 A,执行多步计算来获得新值 B,然后使用 CAS 将 V 的值从 A 改为 B。如果 V 处的值尚未更改,则 CAS 操作成功。
类似于 CAS 的指令允许算法执行读-修改-写操作,而无需害怕其他执行绪修改变数,因为如果其他执行绪修改变数,那幺 CAS 会检测它(并失败),算法可以对该操作重新计算。清单 3 说明了 CAS 操作的行为(而不是性能特徵), CAS 的价值是它可以在硬体中实现,并且是极轻量级的(在大多数处理器中)。
Java中的CAS操作
在JDK1.5之后,Java程式才可以使用CAS操作,该操作由sun.misc.Unsafe类里面的compareAndSwapInt()和compareAndSwapLong()等几个方法包装提供,虚拟机在内部对这些方法做了特殊处理,即时编译出来的结果就是一条平台相关的处理器CAS指令,没有方法调用的过程,或者可以认为是无条件内联进去了。
由于Unsafe类不是提供给用户提供调用的类(Unsafe.getUnsafe()的代码中限制了只有启动类载入器(Bootstrap ClassLoader)载入的Class才能访问它),,如果不採用反射手段,我们只能通过其他的Java API来间接使用它,如J.U.C包里面的整数原子类,其中的 compareAndSet()和 getAndIncrement()等方法都使用了 Unsafe 类的 CAS 操作。

Copyright@2015-2025 www.aizhengw.cn 癌症网版板所有