Skip to content

Latest commit

 

History

History
35 lines (25 loc) · 1.84 KB

File metadata and controls

35 lines (25 loc) · 1.84 KB

CAS(Compare-and-Swap)

原理

  • 实际上是使用了unsafe的CAS操作
  • 用期望值去与内存地址的值判断是否相等,相等则用更新值替换,否则CAS等待

参数

compareAndSwapInt

  • this 对象
  • Offset 内存地址
  • expect 旧的期望值
  • update 新的值

CAS的问题

CAS操作是一种无锁算法,相对于使用锁机制,它能够更好地利用多核处理器的优势,提高并发性能。但是,CAS操作也存在一些问题,包括:

  • ABA问题:在CAS操作中,如果内存位置的当前值与预期原值相等,就会执行修改操作。但是,如果在修改之前,有其他线程对内存位置的值进行了两次修改,从而又恢复为了原来的值,此时CAS操作可能会认为没有被修改过,从而执行了修改操作。这种情况被称为ABA问题。

  • 自旋次数问题:如果CAS操作失败,需要重试,这时会进入自旋状态,不断地进行CAS操作,直到操作成功为止。如果自旋次数太多,会浪费大量的CPU资源,降低系统的性能。

  • 只能保证单个变量的原子操作:CAS操作只能保证单个变量的原子操作,对于多个变量的操作,需要加锁才能保证原子性。

针对上述问题,可以采取一些措施来解决。例如,

  • 针对ABA问题,可以使用带有版本号的CAS操作,从而保证在执行修改操作前,内存位置的值没有被修改过;
  • 针对自旋次数问题,可以设置一个自旋次数的上限,超过上限时放弃自旋,转为使用锁机制;
  • 针对多个变量的原子操作,可以使用分段锁等方式来保证原子性。