Skip to content

锁-StampedLock知识补充 - #2892

Open
sharpener-YuFeng wants to merge 1 commit into
Snailclimb:mainfrom
sharpener-YuFeng:patch-2
Open

锁-StampedLock知识补充#2892
sharpener-YuFeng wants to merge 1 commit into
Snailclimb:mainfrom
sharpener-YuFeng:patch-2

Conversation

@sharpener-YuFeng

Copy link
Copy Markdown

原句比较笼统

原句比较笼统

@Snailclimb Snailclimb left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感谢补充,原文把“当前线程持锁后再次获取一定会返回新 stamp”一概而论,确实不准确。不过当前改法还需要调整后再合入:

  1. tryWriteLock() 这一点需要明确前提是“当前线程已经持有该写锁时再次调用”,否则现在的描述只是该 API 的一般返回语义。
  2. 同一线程连续调用 readLock() 可能成功,是因为读模式本身是共享的,而且 StampedLock 不记录线程所有权;这不能视为读锁具备可重入语义。每次成功获取仍要保存相应的 stamp 并分别释放。
  3. 建议删除“判断是否可重入,重点看独占写锁”。Oracle 文档直接说明 StampedLock 不可重入且没有所有权概念;可重入性不宜仅靠写锁这一点来定义。
  4. 请补齐中英文空格和标点,例如“还是 try 方法:”“使用 tryWriteLock() 时”“非 0 的 stamp”。

建议将这一段精简为:

StampedLock 成功获取读锁或写锁后会返回一个 long 型 stamp,释放锁或转换锁模式时需要传入对应的 stamp;try 系列方法获取失败时返回 0。它是不可重入锁,并且不记录锁的线程所有权。线程持有写锁时再次调用 writeLock(),锁无法识别调用者就是当前持有者,因此会继续等待;调用 tryWriteLock() 则会立即返回 0。同一线程连续调用 readLock() 可能获得多个读 stamp,是因为读模式允许共享,而不是因为锁识别了线程并支持重入;每次成功获取都需要使用对应的 stamp 释放。

依据可参考 Oracle StampedLock API 文档

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants