悲观锁和乐观锁看这篇理解起来真不难

56 阅读2分钟

悲观锁和乐观锁是两种处理多线程或并发环境下数据访问的策略,它们的核心区别在于对数据是否会被并发修改的假设不同。

悲观锁(Pessimistic Lock)

想象一下,你是一个非常小心谨慎的人,每次去图书馆借书时,都担心书可能会被别人同时借走。所以,你采取的策略是:一旦找到想借的书,立刻让图书管理员给你上个“预留标签”,确保别人无法借走,直到你完成借阅流程。悲观锁就是这样,它假定最坏的情况会发生——数据随时可能被别人修改,因此在操作数据前,先锁定数据,不允许其他操作介入,确保数据的独占访问。这样做虽然保证了数据的一致性,但可能会导致其他需要访问该数据的线程等待,影响效率。

乐观锁(Optimistic Lock)

相反,如果你是一个乐观主义者,去图书馆借书时,你会认为大多数人并不会同时对这本书感兴趣,于是你直接开始办理借阅手续,只是在最后确认时询问图书管理员:“这本书在我挑的时候有没有被人借走?”如果没人借,你就顺利借到;如果有人借走了,你再决定是等待还是寻找其他书籍。乐观锁正是基于这种假设——大部分情况下数据不会被并发修改,所以在操作数据的整个过程中并不加锁,只在提交更新时检查数据是否被其他事务修改过(常见的做法是通过版本号或时间戳来验证)。如果有变化,则回滚自己的操作重新尝试,否则完成更新。这种方式减少了锁的使用,提高了系统的并发性能,但在高并发且冲突频繁的场景下,可能会因为多次重试而降低效率。

总结

  • 悲观锁:先锁定后操作,安全但可能影响性能。
  • 乐观锁:先操作后验证,高效但需处理冲突重试。

选择哪种锁,主要取决于应用场景中数据竞争的激烈程度以及对性能与一致性的权衡。