当前位置: 首页 > 图灵资讯 > java面试题> java数据库面试题-什么是乐观锁和悲观锁?

java数据库面试题-什么是乐观锁和悲观锁?

来源:图灵教育
时间:2024-08-18 13:14:27

悲观锁

概念
悲观锁是一种比较保守的并发控制机制。它假设每次数据访问都会发生冲突,因此在读取数据之前会先加锁,确保其他人无法同时修改数据。

特点

  1. 锁定数据:当一个线程加了悲观锁,其他线程就无法访问这个数据,直到锁释放。
  2. 防止冲突:通过锁定数据,确保在修改数据期间不会有其他线程进行修改,从而避免数据冲突。
  3. 性能开销:由于数据被锁定,其他线程需要等待锁释放,这可能导致性能下降,特别是在高并发场景下。

例子
想象一下,你在图书馆借了一本书,在你还书之前,其他人不能借这本书。这就是悲观锁的概念。

乐观锁

概念
乐观锁是一种比较乐观的并发控制机制。它假设数据冲突不常发生,因此在读取数据时不加锁,而是在更新数据时检查是否有冲突。

特点

  1. 版本控制:乐观锁通常通过版本号或时间戳来实现。在读取数据时,会记录当前数据的版本号,更新数据时会检查版本号是否变化。
  2. 减少等待:因为不加锁,其他线程可以同时访问数据,这样可以提高系统的并发性能。
  3. 冲突检测:在更新数据时,如果发现版本号变化,表示数据已经被其他线程修改过,这时需要重新读取数据并重试更新。

例子
还是图书馆的例子,你在读一本书的时候,其他人也可以同时读这本书。当你决定要借书时,图书馆会检查这本书是否已经被别人借走,如果没有,你可以成功借书;如果已经被别人借走,你需要重新选择。

总结

  • 悲观锁:假设会发生冲突,先加锁再操作,确保数据安全但可能导致等待和性能下降。
  • 乐观锁:假设不会发生冲突,不加锁但在更新时检查冲突,提高并发性能但需要处理冲突。

在实际应用中,选择使用哪种锁取决于具体的业务场景和并发访问的特点。如果数据冲突频繁,悲观锁可能更合适;如果数据冲突较少,乐观锁可能更高效。