您能否仅使用AtomicInteger进行锁定来创建ReadWriteLock?

时间:2018-09-07 23:23:32

标签: java concurrency atomic atomicinteger

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

与常规的ReentrantReadWriteLock有何不同?

1 个答案:

答案 0 :(得分:2)

TL; DR -不起作用。

  1. 正如@Radiodef指出的那样,您将无法实现ReadWriteLock API。如果锁的状态仅为单个getOwner,则getQueuedThreadsAtomicInteger等方法将无法实现。

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

    < / li>
  3. 如果仅使用单个AtomicInteger作为锁的状态,则无法将线程停在竞争的锁上。 (要使停车工作,释放锁的线程需要知道要释放的线程。但是您不能表示该线程。)这意味着您将需要使用spinlocking 1 ,这种方法既昂贵又昂贵。无法缩放。

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


1-使用自旋锁时,等待竞争锁的线程“旋转”执行繁忙循环,直到锁可用为止。当争用不太可能且存在时间很短时...或当核心无能为力时,这对于锁是可以的。但这对于正常使用而言效率太低。