java实现悲观锁乐观锁
时间: 2024-11-21 16:19:08 浏览: 7
SpringBoot整合MyBatis实现乐观锁和悲观锁的示例
在Java中,锁机制用于控制并发访问,分为悲观锁和乐观锁两种主要策略:
1. **悲观锁**(Pessimistic Locking):
- Java中最常见的悲观锁实现就是`synchronized`关键字或者`ReentrantLock`类。当一个线程获取到锁后,其他线程会阻塞等待该锁释放。这种方式认为并发环境通常会发生冲突,所以先假设会有争抢,提前锁定资源。
- `synchronized`块或方法会自动获取并保持对共享资源的独占权限,直到方法执行结束或遇到`return`、`break`等跳出语句。
```java
synchronized (sharedObject) {
// 访问共享资源的代码
}
```
2. **乐观锁**(Optimistic Locking):
- 乐观锁假定在大多数情况下并发操作不会发生冲突,因此它在操作开始时不立即锁定资源,而是先尝试读取数据。如果读取的数据未被其他线程修改,则直接更新;如果发现有冲突(如读取到的版本号与预期不符),则回滚操作并让其他线程再次尝试。
- Java中的乐观锁常见于`RowVersion`模式,比如`AtomicInteger`、`ConcurrentHashMap`等提供的是`incrementAndGet()`、`compareAndSet()`这类原子操作。在更新数据前检查版本号是否一致。
```java
int currentValue = map.get(key);
if (compareAndSet(map, key, currentValue, currentValue + 1)) {
// 更新成功
} else {
// 有人抢先修改了,需要重试
}
```
阅读全文