如果您使用位掩码将读取和写入锁定存储在单个AtomicInteger
中,您能否实现快速的ReadWriteLock
类?
与常规的ReentrantReadWriteLock有何不同?
答案 0 :(得分:2)
TL; DR -不起作用。
正如@Radiodef指出的那样,您将无法实现ReadWriteLock
API。如果锁的状态仅为单个getOwner
,则getQueuedThreads
,AtomicInteger
等方法将无法实现。
完全重新进入将无法实现。重入通常需要您对当前持有锁的线程的身份进行编码,并为每个线程重入计数。对于读者,我们可以使用一个计数(没有身份),但是单个作者需要一个身份和一个计数。将计数和线程身份转换为32位整数可能不起作用。 (Thread
确实提供了一个数字id
属性,该属性在线程的生存期内是唯一且不变的……但是id
是一个long
。)
如果仅使用单个AtomicInteger
作为锁的状态,则无法将线程停在竞争的锁上。 (要使停车工作,释放锁的线程需要知道要释放的线程。但是您不能表示该线程。)这意味着您将需要使用spinlocking 1 ,这种方法既昂贵又昂贵。无法缩放。
总而言之,您无法实现ReadWriteLock API或完整的重入语义。如果删除了这些要求,则可以可能实现简单的读写锁(对于读者来说是可重入的,对于作者来说是不可重入的),但是您需要进行自旋锁定。
1-使用自旋锁时,等待竞争锁的线程“旋转”执行繁忙循环,直到锁可用为止。当争用不太可能且存在时间很短时...或当核心无能为力时,这对于锁是可以的。但这对于正常使用而言效率太低。