CAS
CAS Compare and Swap
一种高效实现线程安全性的方法
- 支持原子更新操作,适用于计数器,序列发生器(给变量自增)等场景。
- 属于乐观锁机制,号称lock-free。
- CAS操作失败时由开发者决定是继续尝试,还是执行别的操作。
CAS思想
- 包含三个操作数——内存位置(V)、预期值(A)和新值(B)
- 执行时将内存位置的值与预期值比较,相等则改为新值,不同则不做操作
CAS多数情况下对开发者来说是透明的
- J.U.C的atomic包提供了常用的原子性数据类型以及引用、数组等相关原子类型和更新操作工具,是很多线程安全程序等首选。
- Unsafe类虽然提供CAS服务,但因能够操纵任意内存地址读写而有隐患
- Java 9 以后,可以使用Variable Handle API来替代Unsafe
CAS缺点
- 若循环时间长 ,则开销很大
- 只能保证一个共享变量的原子操作
- ABA问题
- 如果内存地址V初次读取到的值是A,在准备改变时发现仍然是A,就默认其没被改变过,但实际上可能被改成A又被改成B。
- 解决:AtomicStampedRefernce,带有标记的原子引用类。通过控制变量值的版本来保证CAS的正确性
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Alfred的小站!