上篇文章中我们提到了悲观锁和乐观锁,我们知道乐观锁的一种实现方式就是CAS算法。但CAS在Java中的应用远不止于此。
首先我们了解下CAS的概念:它是一种通过对比预期值的方式保证同步的思想,比如一个变量的值是V1,当我要修改这个变量时,我会先将它目前的值和V1比较,若相等则修改,若不相等则重试一定次数。
下面介绍一部分CAS在Java中的应用:
1.AtomicInteger等原子类的线程安全
2.JDK1.8中ConcurrentHashMap的线程安全(更新size时使用)
3.ReenTrantLock中更改锁状态
4.创建对象的内存分配线程安全性
后续文章会详细介绍上面的每一种应用实现。
但CAS也有它的缺陷:
1.可能产生ABA的问题
接着上面的例子,变量值为V1,有可能是变成V2后又变回了V1,这在CAS看来是未曾改变过。这个缺陷可以结合版本号( AtomicStampedReference)来解决。
2.循环时长开销比较大
重试次数过大导致的资源浪费
网友评论