1、什么是cas
cas是compareandswap的简称,Java从1.5开始引入乐观锁。
ABA 问题
当线程一拿到资源A进行比较的时候,此时线程二刚好也拿到了资源A也开始进行比较,这样线程一和线程二都成功了,但是资源A只加了一,
为了解决这个问题,在变量前面追加版本号:每次变量更新就把版本号加1,则A-B-A就变成1A-2B-3A。
2、长时间自旋消耗资源
自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。
3、只能保证一个变量的原子操作
如上图所示,只能保证A得原子操作,如果在多几个变量就不能够使用了。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行CAS操作。
CAS 的应用
1.Java的concurrent包下就有很多类似的实现类,如Atomic
2.自旋锁(ConcurrentHashMap就使用了CAS加synchronized来实现)
private static final sun.misc.Unsafe U;
3.令牌桶限流器
令牌桶限流器 就是系统以恒定的速度向桶内增加令牌。每次请求前从令牌桶里面获取令牌。如果获取到令牌就才可以进行访问。当令牌桶内没有令牌的时候,拒绝提供服务。我们来看看 eureka 的限流器是如何使用 CAS 来维护多线程环境下对 token 的增加和分发的。
参考文章
https://blog.csdn.net/ln_6am/article/details/85642853
https://cloud.tencent.com/developer/article/1462258