4

如果你使用位掩码将读写锁存储在一个单一的AtomicInteger中,你能实现一个快速的ReadWriteLock类吗?

它与常规的 ReentrantReadWriteLock 有何不同?

4

1 回答 1

2

TL;DR - 它不会工作。

  1. 正如@Radiodef 指出的那样,您将无法实现ReadWriteLockAPI。如果锁的状态只是一个单一的,那么诸如getOwner,之类的方法是无法实现的。getQueuedThreadsAtomicInteger

  2. 完全可重入将无法实现。重入通常要求您对当前持有锁的线程的身份以及每个线程的重入计数进行编码。对于读者,我们可以使用单个计数(并且没有身份),但单个作者需要身份和计数。将计数和线程标识转换为 32 位整数可能不起作用。(AThread确实提供了一个数字id属性,该属性在线程的生命周期内是唯一且不变的……但idis a long。)

  3. 如果只使用一个AtomicInteger作为锁的状态,则不能将线程等待在竞争锁上。(为了让停放工作,释放锁的线程需要知道要解除停放哪个线程。但你不能代表这一点。)这意味着你需要使用昂贵且不可扩展的自旋锁1 。

总之,您无法实现 ReadWriteLock API 或完全可重入语义。如果您删除了这些要求,您可能实现简单的读写锁(读者可重入,写入者不可重入),但您需要进行自旋锁。


1 - 使用自旋锁,等待竞争锁的线程“自旋”执行繁忙循环,直到锁可用。当争用不太可能和短暂的......或者当核心无能为力时,这对于锁来说是可以的。但是对于正常使用来说效率太低了。

于 2018-09-08T01:47:41.530 回答