> 文章列表 > CAS操作实际上包含了哪两个步骤?

CAS操作实际上包含了哪两个步骤?

CAS操作实际上包含了哪两个步骤?

目录

先讲原理:

再深入CAS规则:

问题:第一步是否应该是修改预期值?

总结一下:


先讲原理:

CAS的全称是Compare And Swap(比较并交换),是一种原子操作,通常用于多线程编程中的并发控制。

在CAS中,有三个值:

  • V:要更新的变量
  • E:预期值
  • N:新值

CAS操作可以简单描述为:如果变量V的值等于预期值E,则将变量V的值更新为新值N,否则不做任何操作。

以下是一个使用CAS的示例:

假设有两个线程同时要对变量x进行操作,线程A要将x的值从1改为2,线程B要将x的值从1改为3。如果两个线程都直接对x进行操作,则可能导致竞争条件和数据不一致的问题。因此,可以使用CAS来解决这个问题。

  1. 线程A首先读取x的值,发现为1,于是将预期值E设为1,新值N设为2,然后执行CAS操作。由于此时变量x的值还是1,因此CAS操作成功,x的值被更新为2。

  2. 线程B也首先读取x的值,发现为1,于是将预期值E设为1,新值N设为3,然后执行CAS操作。但是此时变量x的值已经被线程A修改为了2,因此CAS操作失败,线程B需要重新尝试操作。

通过使用CAS操作,可以保证对变量的更新操作是原子性的,从而避免了多线程之间的竞争条件和数据不一致问题。

再深入CAS规则:

CAS操作确实包含了两个步骤:

  1. 比较变量V的当前值和预期值E是否相等。
  2. 如果相等,则将变量V的值更新为新值N,否则不做任何操作。

这两个步骤在CAS操作中是原子的,也就是说,它们是作为一个整体来执行的,不会被其他线程干扰或中断。因此,CAS操作是一种原子操作,可以保证多线程并发环境下对变量进行安全的读写操作。

需要注意的是,虽然CAS操作包含了两个步骤,但是它们是作为一个整体来执行的,因此在CAS操作执行期间,变量V的值始终保持一致,其他线程无法修改变量V的值,直到CAS操作执行完毕。

问题:第一步是否应该是修改预期值?

实际上,在CAS操作中,并没有显式地涉及修改预期值这一步骤。CAS操作包含以下两个步骤:

  1. 比较变量V的当前值和预期值E是否相等。
  2. 如果相等,则将变量V的值更新为新值N,否则不做任何操作。

在执行CAS操作时,预期值E通常由当前线程在执行CAS操作之前获取,用于指定变量V的期望值。因此,可以将第一步骤视为将预期值E与变量V的当前值进行比较,判断它们是否相等。

如果比较结果为相等,则CAS操作会进入第二步骤,将变量V的值更新为新值N。否则,CAS操作不会执行任何操作,直接返回操作失败。

因此,可以将CAS操作视为一个原子操作,其中包含了两个步骤。由于CAS操作是原子的,因此可以保证多线程并发环境下对变量进行安全的读写操作。

总结一下:

因为CAS是⼀种原⼦操作,它是⼀种系统原语,是⼀条CPU的原⼦指令,从CPU层⾯保证它的原⼦性。
当多个线程同时使⽤CAS操作⼀个变量时,只有⼀个会胜出,并成功更新,其余均会失败,但失败的线程并不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。

官林网