什么是计算机编程领域的乐观锁和悲观锁

简介: 什么是计算机编程领域的乐观锁和悲观锁

乐观锁和悲观锁是计算机编程领域中用于处理并发访问数据的两种不同策略。它们的主要目标是在多个线程或进程同时访问共享数据时,保证数据的一致性和完整性,避免出现竞态条件(Race Condition)。在不同的情景下,选择合适的锁策略可以提高程序的性能和可靠性。


1. 悲观锁(Pessimistic Locking):

悲观锁假定在操作数据时,会发生竞态条件,因此默认情况下将数据锁定,防止其他线程或进程同时修改数据。这种策略认为并发冲突是常态,因此在数据访问时会加上锁,以确保每次只有一个线程可以访问数据,从而避免并发问题。


示例

假设有一个银行账户,多个用户可以同时访问并进行取款操作。使用悲观锁,当一个用户开始取款时,系统会将账户数据加锁,直到该用户完成取款操作。其他用户必须等待锁释放,才能进行操作。

在数据库中,悲观锁可以使用SELECT ... FOR UPDATE语句来实现。当一个事务执行该语句时,它会锁定选定的行,直到事务完成。


2. 乐观锁(Optimistic Locking):

乐观锁的思想是,大多数情况下,数据的并发冲突是很少发生的,因此不采取过多的锁定,而是在更新数据之前先进行一次检查,确认数据是否被其他线程修改过。如果没有被修改,就进行更新操作,否则,重新尝试或者进行冲突处理。


示例:

考虑一个在线购物网站,多个用户可以同时购买同一商品。使用乐观锁,每个商品记录会有一个版本号。当用户要购买商品时,系统会读取商品的版本号,然后用户提交订单时,系统会再次检查版本号,如果版本号一致,就执行购买操作,然后将版本号递增;如果版本号不一致,意味着在用户浏览商品和购买之间有其他用户修改了数据,那么系统会提示用户重新确认购买操作。


在数据库中,乐观锁可以通过添加一个版本号字段来实现。在更新数据时,检查当前版本号是否与预期版本号匹配,如果匹配则执行更新,否则表示数据已被修改。


选择合适的锁策略:

选择悲观锁还是乐观锁取决于具体的应用场景和并发访问模式。

  • 悲观锁适用于:并发冲突非常频繁,数据修改操作复杂,竞争较激烈的情况。然而,悲观锁可能导致系统性能下降,因为它会频繁地阻塞等待锁。
  • 乐观锁适用于:并发冲突相对较少,大部分情况下数据是安全的,只有极少数情况下才会出现竞态条件的情况。乐观锁不会引入太多的锁开销,但需要在冲突处理方面考虑更多的逻辑。


在实际应用中,可以根据业务需求和性能要求选择合适的锁策略,甚至可以在同一个系统中同时使用悲观锁和乐观锁,针对不同的数据进行不同的处理。


总结:


乐观锁和悲观锁是处理并发访问数据的两种主要策略。悲观锁假设并发冲突是常态,会在数据访问时加锁,以避免竞态条件。乐观锁则假设并发冲突较少,先进行操作并在更新前检查数据是否被修改过。在实际应用中,根据并发访问模式和性能需求,选择合适的锁策略是确保数据一致性和程序可靠性的关键。

相关文章
|
5月前
|
安全 Java 关系型数据库
乐观锁与悲观锁
【4月更文挑战第11天】乐观锁与悲观锁
38 3
|
5月前
|
算法 Java 关系型数据库
面试必备之何谓悲观锁与乐观锁
乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。
47 1
|
XML 前端开发 Java
案例突破——悲观锁和乐观锁
案例突破——悲观锁和乐观锁
138 0
案例突破——悲观锁和乐观锁
|
算法
悲观锁和乐观锁的区别
悲观锁和乐观锁的区别
221 0
|
数据库
乐观锁和悲观锁的底层原理
乐观锁和悲观锁是并发编程中常用的两种锁机制,用于解决多线程或多进程环境下的并发访问问题。它们的底层原理和适用场景有所不同。
141 0
|
算法 Java 关系型数据库
何谓悲观锁与乐观锁
何谓悲观锁与乐观锁
|
Java 关系型数据库 程序员
深入浅出乐观锁、悲观锁
深入浅出乐观锁、悲观锁
深入浅出乐观锁、悲观锁
|
SQL 算法 安全
看完你就应该能明白的悲观锁和乐观锁
Java 按照锁的实现分为乐观锁和悲观锁,乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想,乐观锁和悲观锁对于理解 Java 多线程和数据库来说至关重要,那么本篇文章就来详细探讨一下这两种锁的概念以及实现方式。
159 0
看完你就应该能明白的悲观锁和乐观锁
|
算法 Oracle Java
乐观锁与悲观锁|学习笔记
快速学习乐观锁与悲观锁
乐观锁与悲观锁|学习笔记
|
存储 SQL Java
面试官问你悲观锁和乐观锁的区别
面试官问你悲观锁和乐观锁的区别
152 0