悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)是并发控制的两种不同思想。
悲观锁:
- 假设并发环境下会发生冲突,所以在访问共享资源之前,会先获取锁来保护资源。
- 当一个线程获得锁后,其他线程必须等待该线程释放锁才能继续执行。
- 悲观锁通常使用互斥锁(如 synchronized 关键字、ReentrantLock)来实现,阻塞其他线程的执行,确保资源独占性。
- 悲观锁的特点是安全可靠,但也可能导致线程阻塞和上下文切换的开销增加,降低并发性能。
乐观锁:
- 假设并发环境下不会发生冲突,所以在访问共享资源之前,并不获取锁。
- 当一个线程要更新资源时,首先读取资源的当前版本号或状态,然后进行操作,并尝试提交更新。
- 提交更新时,会重新检查资源的版本号或状态,如果没有发生变化,则操作成功;否则,说明其他线程已经修改了资源,操作失败,需要进行相应处理(如重试)。
- 乐观锁通常使用无锁算法(如CAS)或版本号来实现,并不阻塞其他线程的执行。
- 乐观锁的特点是并发性好,无阻塞,但可能出现操作失败需要重试的情况。
悲观锁适用于写操作较多、冲突概率较高的场景,保证数据的一致性和安全性;而乐观锁适用于读操作较多、冲突概率较低的场景,提高并发性能。
需要根据具体场景和需求选择使用悲观锁还是乐观锁。在实践中,常常会将二者结合使用,根据情况选择最合适的并发控制方式。