1. 悲观锁 (Pessimistic Lock)
定义:假设并发冲突一定会发生,因此在访问数据前先加锁,确保独占访问。
常见实现:
- 数据库:
SELECT ... FOR UPDATE
(MySQL) - Java:
synchronized
关键字,ReentrantLock
- 应用场景:
- 写多读少的环境
- 临界区代码执行时间长
- 需要保证强一致性的场景
特点:
// 数据库悲观锁示例
BEGIN TRANSACTION;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- 加锁
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
2. 乐观锁 (Optimistic Lock)
定义:假设并发冲突不常发生,只在提交时检查是否有冲突。
常见实现:
- 数据库:版本号机制(version/timestamp), CAS(Compare-And-Swap)
- Java:
Atomic
系列类 - 应用场景:
- 读多写少的环境
- 冲突概率低的场景
- 需要高吞吐量的系统
特点:
// Java乐观锁示例
public class OptimisticLock {
private AtomicInteger version = new AtomicInteger(0);
public void update() {
int currentVersion = version.get();
// 模拟业务计算
boolean success = version.compareAndSet(currentVersion, currentVersion + 1);