所以可以看出CAS算法其实是无锁的 。好处是在读多写少的情况下 , 性能是比较好的 。那么CAS算法的缺点其实也是很明显的 。
- ABA问题 。线程C将内存值A改成了B后 , 又改成了A , 而线程D会认为内存值A没有改变过 , 这个问题就称为ABA问题 。解决办法很简单 , 在变量前面加上版本号 , 每次变量更新的时候变量的版本号都+1 , 即A->B->A就变成了1A->2B->3A 。
- 在写多读少的情况下 , 也就是频繁更新数据 , 那么会导致其他线程经常更新失败 , 那么就会进入自旋 , 自旋时会占用CPU资源 。如果资源竞争激烈 , 多线程自旋的时间长 , 导致消耗资源 。
相反 , 在写多读少的场景下 , 如果使用乐观锁会导致更新时经常产生冲突 , 然后线程会循环重试 , 这样会增大CPU的消耗 。在这种情况下 , 建议可以使用悲观锁 。
总结在日常的开发中 , 悲观锁和乐观锁应该是见得最多 , 用得最多的锁 , 比如最常见的synchronized和ReentrantLock是悲观锁 , 并发包中的原子类和ConcurrentHashMap则用了乐观锁 。锁的实现并不复杂 , 关键是搞懂这两种锁的思想 , 这样才能在合适的地方使用合适的锁 。
这篇文章就讲到这里了 , 希望看完后能有所收获 , 感谢你的阅读 。
【什么是悲观锁和乐观锁?】
推荐阅读
- 2021年进入五九还冷吗 2021年数九什么时候最冷
- 漂流的过程 漂流多少钱
- 盒马鲜生是会员才能购物吗 盒马鲜生会员店一定要是会员吗
- 狗狗吃猕猴桃有什么好处 兔子耳朵给狗吃对狗好吗
- 使用Docker镜像
- 什么是PE系统?建议有电脑的同志用U盘做一个备用
- 2014年茶市走向,广东早茶般是几点
- MySQL的 join 操作弱爆了?
- 临沧邦东古茶园,邦东最有名的是昔归茶
- 折耳猫为什么性格温顺 折耳猫有什么特点
