StampedLock
是 Java 并发包中提供的一种锁机制,用于控制对共享资源的读写访问。它提供了三种主要的访问模式:写锁、读锁和乐观读锁。StampedLock
在内部通过使用状态标记(stamps)来管理这些锁,这些标记既表示锁的类型,也表示特定锁的版本。下面我们将从源码角度解释 StampedLock
,然后通过代码示例展示乐观锁、读锁和写锁的使用。
StampedLock
源码概述
在 StampedLock
的实现中,状态(state)是一个 long
类型的变量,它的不同部分表示不同类型的锁。StampedLock
使用一系列位操作来管理和更新这个状态变量,以此来实现锁机制。
- 写锁:通过设置特定的位来表示写锁。如果这些位被设置,意味着写锁正在被持有。
- 读锁:通过增加状态变量的特定部分的计数来表示读锁的数量。多个线程可以同时持有读锁。
- 乐观读锁:它不实际持有锁,而是通过检查状态变量在读取之前和之后是否发生变化来判断是否有写操作。
代码示例
1. 乐观读锁示例
class OptimisticReadExample {
private final StampedLock lock = new StampedLock();
private int sharedData = 0;
public void optimisticRead() {
long stamp = lock.tryOptimisticRead();
int currentData = sharedData;
if (!lock.validate