什么是悲观锁和乐观锁?( 二 )

所以可以看出CAS算法其实是无锁的 。好处是在读多写少的情况下 , 性能是比较好的 。那么CAS算法的缺点其实也是很明显的 。

  • ABA问题 。线程C将内存值A改成了B后 , 又改成了A , 而线程D会认为内存值A没有改变过 , 这个问题就称为ABA问题 。解决办法很简单 , 在变量前面加上版本号 , 每次变量更新的时候变量的版本号都+1 , 即A->B->A就变成了1A->2B->3A 。
  • 在写多读少的情况下 , 也就是频繁更新数据 , 那么会导致其他线程经常更新失败 , 那么就会进入自旋 , 自旋时会占用CPU资源 。如果资源竞争激烈 , 多线程自旋的时间长 , 导致消耗资源 。
使用场景在读多写少的场景下 , 更新时很少发生冲突 , 使用乐观锁 , 减少了上锁和释放锁的开销 , 可以有效地提升系统的性能 。
相反 , 在写多读少的场景下 , 如果使用乐观锁会导致更新时经常产生冲突 , 然后线程会循环重试 , 这样会增大CPU的消耗 。在这种情况下 , 建议可以使用悲观锁 。
总结在日常的开发中 , 悲观锁和乐观锁应该是见得最多 , 用得最多的锁 , 比如最常见的synchronized和ReentrantLock是悲观锁 , 并发包中的原子类和ConcurrentHashMap则用了乐观锁 。锁的实现并不复杂 , 关键是搞懂这两种锁的思想 , 这样才能在合适的地方使用合适的锁 。
这篇文章就讲到这里了 , 希望看完后能有所收获 , 感谢你的阅读 。

【什么是悲观锁和乐观锁?】


推荐阅读