stamp是stampedlock返回的long类型标记值,用于标识锁状态、解锁(unlockwrite)和乐观读验证;非0表示获取成功,0表示失败(超时或中断),且不可重入、必须配对使用。

StampedLock 的 tryWriteLock(long, TimeUnit) 方法就是用来带超时获取写锁的,它会在指定时间内尝试获取写锁,超时则返回 0(表示失败),成功则返回一个有效的 stamp。
stamp 是什么?
Stamp 是 StampedLock 的核心概念,它不是布尔值,而是一个 long 类型的标记值。它既用于加锁,也用于解锁和验证锁状态:
- 返回值为 0 → 获取锁失败(超时或被中断)
- 返回值非 0 → 获取成功,该值即为“stamp”,后续必须用它来解锁(
unlockWrite(stamp))或做乐观读校验
基本用法示例
以下是最常见的带超时写锁获取方式:
long stamp = lock.tryWriteLock(1, TimeUnit.SECONDS);
if (stamp != 0) {
try {
// 执行写操作
data = newData;
} finally {
lock.unlockWrite(stamp); // 必须用同一个 stamp 解锁
}
} else {
// 获取写锁超时,可选择重试、降级、抛异常或走其他逻辑
throw new TimeoutException("Failed to acquire write lock within 1 second");
}
注意的关键点
-
不可重入:同一个线程重复调用
tryWriteLock(即使 stamp 未释放)会阻塞或失败,StampedLock 不支持重入 -
不响应中断:该方法本身不会抛出
InterruptedException,但若在等待期间线程被中断,会立即返回 0(不是抛异常) -
stamp 必须配对使用:不能用别的 stamp 或硬编码值调用
unlockWrite,否则可能破坏锁状态甚至引发IllegalMonitorStateException -
超时精度有限:底层依赖
LockSupport.parkNanos,实际等待时间可能略大于指定值,尤其在系统负载高时
和普通 writeLock 的区别
writeLock() 是阻塞式,不超时;而 tryWriteLock(timeout) 是非阻塞+超时控制,适合对响应性有要求的场景,比如实时服务、定时任务或避免死锁的协作逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











