什么是CAS
CAS是现代处理器内部实现,用于解决在多线程环境下,通过对同一内存地址的值进行修改时,确保该操作,是原子的。
主要实现原理,在提交修改时,将该内存地址中原值进行取出,与传入的旧值进行比较,如果一致,那么将新值写入该内存地址。
在Java中,提供了三种类型操作类:
普通类型
AtomicInteger:用于对整形数据的修改
AtomicIntegerArray:用于对数组整形成员进行修改,每次修改时,需要额外提供数组索引下标。
引用类型
AtomicReference 用于修改该内存地址的引用 AtomicStampedReference 用于解决ABA问题而产生,在每次修改前,可以取出版本号进行比较。两个参数,第一个参数为泛型V,第二个参数为初始版本号
AtomicMarkableReference 也是用于解决ABA问题,不过第二个参数为布尔型,其关注该值有没有被修改过,与AtomicStampedReference的区别在于,AtomicStampedReference关心的是值被修改了几次
引用字段类型
AtomicIntegerFieldUpdater 原子更新整形字段值
AtomicLongFieldUpdater 原子更新长整形字段值
AtomicReferenceFieldUpdater 原子更新引用字段值
什么是ABA问题?
ABA问题就是,在修改一个值前,获取到该值原值为A,然后中间由操作系统的调度暂停,此期间由其他线程执行时,将此值修改到了B,然后又修改回了A,此时线程调度回来进行修改时,发现旧值与原来的值一致,实际上中间被修改过。这就是ABA问题的产生。
CAS注意事项
如果在CAS使用时,通过自旋的方式对值进行修改,那么会造成一定资源的消耗,因为需要保证修改成功,所以需要采用自旋的方式不断尝试,直到成功为止,每次修改大概需要耗费0.6ns,对于cpu来讲是很低的消耗
只能保证一个变量的原子性。