【问题标题】:Could you make a ReadWriteLock using just an AtomicInteger for locks?你能用一个 AtomicInteger 来做一个 ReadWriteLock 吗?
【发布时间】:2019-02-13 06:54:36
【问题描述】:

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

它与常规的 ReentrantReadWriteLock 有何不同?

【问题讨论】:

  • 为了履行Lock的合约,你至少需要有一个地方来存储对当前持有锁的线程的引用。在 Java 中你不能用整数来做到这一点。

标签: java concurrency atomic atomicinteger


【解决方案1】:

TL;DR - 它不起作用。

  1. 正如@Radiodef 指出的那样,您将无法实现ReadWriteLock API。如果锁的状态只是一个AtomicInteger,则getOwnergetQueuedThreads等方法是无法实现的。

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

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

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


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

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多