- 实际上是使用了unsafe的CAS操作
- 用期望值去与内存地址的值判断是否相等,相等则用更新值替换,否则CAS等待
compareAndSwapInt
- this 对象
- Offset 内存地址
- expect 旧的期望值
- update 新的值
CAS操作是一种无锁算法,相对于使用锁机制,它能够更好地利用多核处理器的优势,提高并发性能。但是,CAS操作也存在一些问题,包括:
-
ABA问题
:在CAS操作中,如果内存位置的当前值与预期原值相等,就会执行修改操作。但是,如果在修改之前,有其他线程对内存位置的值进行了两次修改,从而又恢复为了原来的值,此时CAS操作可能会认为没有被修改过,从而执行了修改操作。这种情况被称为ABA问题。 -
自旋次数问题
:如果CAS操作失败,需要重试,这时会进入自旋状态,不断地进行CAS操作,直到操作成功为止。如果自旋次数太多,会浪费大量的CPU资源,降低系统的性能。 -
只能保证单个变量的原子操作
:CAS操作只能保证单个变量的原子操作,对于多个变量的操作,需要加锁才能保证原子性。
针对上述问题,可以采取一些措施来解决。例如,
- 针对ABA问题,可以使用带有版本号的CAS操作,从而保证在执行修改操作前,内存位置的值没有被修改过;
- 针对自旋次数问题,可以设置一个自旋次数的上限,超过上限时放弃自旋,转为使用锁机制;
- 针对多个变量的原子操作,可以使用分段锁等方式来保证原子性。