Skip to content

Golang面试题:什么是 CAS?

什么操作叫做原子操作

一个或者多个操作在 CPU执行过程中不被中断的特性,称为原子性(atomicity)。这些操作对外表现成一个不可分割 的整体,他们要么都执行,要么都不执行,外界不会看到他们只执行到一半的状态。而在现实世界中,CPU 不可能 不中断的执行一系列操作,但如果我们在执行多个操作时,能让他们的中间状态对外不可⻅,那我们就可以宣城他 们拥有了“不可分割”的原子性。

在 Go中,一条普通的赋值语句其实不是一个原子操作。列如,在32 位机器上写 int64 类型的变量就会有中间状 态,因为他会被拆成两次写操作(MOV)——写低32 位和写高32 位。

原子操作和锁的区别

原子操作由底层硬件支持,而锁则由操作系统的调度器实现。锁应当用来保护一段逻辑,对于一个变量更新的保 护,原子操作通常会更有效率,并且更能利用计算机多核的优势,如果要更新的是一个复合对象,则应当使用 atomic.Value 封装好的实现。

什么是 CAS

CAS的全称为 Compare And Swap,直译就是比较交换。是一条 CPU的原子指令,其作用是让 CPU先进行比较两 个值是否相等,然后原子地更新某个位置的值,其实现方式是给予硬件平台的汇编指令,在 intel 的 CPU中,使用 的 cmpxchg指令,就是说 CAS是靠硬件实现的,从而在硬件层面提升效率。

简述过程是这样:

假设包含3 个参数内存位置(V)、预期原值(A)和新值(B)。

V表示要更新变量的值,E表示预期值,N表示新值。

仅当 V 值等于 E值时,才会将 V的值设为 N,如果 V值和 E值不同,则说明已经有其他线程在做更新,则当前线程什么都 不做,最后 CAS返回当前 V的真实值。

CAS操作时抱着乐观的态度进行的,它总是认为自己可以成功完成操作。

基于这样的原理,CAS操作即使没有锁,也可以发现其他线程对于当前线程的干扰。