CAS

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

posted @ 2021-07-23 21:41  奥里给  阅读(282)  评论(1编辑  收藏  举报