锁
1.乐观锁与悲观锁;
悲观锁:认为线程安全问题一定发生,
核心:先取锁,再访问。我认为数据冲突是大概率事件,所以先锁住,确保安全
优点:
简单粗暴:实现简单,保证了数据的强一致性。
安全:在竞争激烈、冲突概率高的场景下,可以避免大量的重试开销。
缺点:
性能开销大:加锁和释放锁的操作需要消耗资源。
并发度低:一个事务持有锁期间,其他所有需要该锁的事务都必须等待,降低了系统的吞吐量。
死锁风险:多个事务相互等待对方持有的锁,可能导致死锁。
----
乐观锁:认为线程安全不一定发生,
核心:先访问,再提交时检查。我认为数据冲突是小概率事件,所以直接操作,在提交更新时才检查这期间有没有人动过。
优点
性能高,并发度高:在没有冲突的情况下,省去了加锁、解锁的开销,大大提升了系统吞吐量。
无死锁风险:因为根本不加锁。
缺点
存在失败风险:如果冲突频繁,会导致大量事务更新失败,不断重试,反而降低性能。
ABA问题:这是CAS的一个典型问题。一个值从A变成了B,然后又变回了A。CAS检查时会认为它没有变化,实际上是变化过的。通常通过添加时间戳或递增版本来解决。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Hexo!