您可以只使用 AtomicInteger 来创建 ReadWriteLock 锁吗?
Could you make a ReadWriteLock using just an AtomicInteger for locks?
如果使用位掩码将读写锁存储在单个AtomicInteger
中,是否可以实现快速ReadWriteLock
class?
它与常规的 ReentrantReadWriteLock 有何不同?
TL;DR - 它不会起作用。
正如@Radiodef 指出的那样,您将无法实施 ReadWriteLock
API。 getOwner
、getQueuedThreads
等方法如果锁的状态只是一个AtomicInteger
.
是无法实现的
完全重入将无法实现。重入通常需要您对当前持有锁的线程的标识以及每个线程的重入计数进行编码。对于读者,我们可以使用单个计数(没有身份),但单个作者需要身份和计数。将计数和线程身份硬塞进 32 位整数可能行不通。 (Thread
确实提供了一个数字 id
属性,该属性在线程的生命周期内是唯一且不变的......但是 id
是 long
。)
如果只使用一个 AtomicInteger
作为锁的状态,则无法停放等待争用锁的线程。 (要使停车工作,释放锁的线程需要知道要取消停车的线程。但您不能表示这一点。)这意味着您需要使用自旋锁1,这昂贵且不可扩展。
总而言之,您无法实现 ReadWriteLock API 或完整的重入语义。如果删除这些要求,您可以可能实现简单的读写锁(读者可重入,作者不可重入),但您需要进行自旋锁。
1 - 使用自旋锁,等待争用锁的线程 "spins" 执行忙循环,直到锁可用。当争用不太可能且持续时间很短时,这对于锁来说是可以的……或者当核心无能为力时。但是对于正常使用来说效率太低了。
如果使用位掩码将读写锁存储在单个AtomicInteger
中,是否可以实现快速ReadWriteLock
class?
它与常规的 ReentrantReadWriteLock 有何不同?
TL;DR - 它不会起作用。
正如@Radiodef 指出的那样,您将无法实施
ReadWriteLock
API。getOwner
、getQueuedThreads
等方法如果锁的状态只是一个AtomicInteger
. 是无法实现的
完全重入将无法实现。重入通常需要您对当前持有锁的线程的标识以及每个线程的重入计数进行编码。对于读者,我们可以使用单个计数(没有身份),但单个作者需要身份和计数。将计数和线程身份硬塞进 32 位整数可能行不通。 (
Thread
确实提供了一个数字id
属性,该属性在线程的生命周期内是唯一且不变的......但是id
是long
。)如果只使用一个
AtomicInteger
作为锁的状态,则无法停放等待争用锁的线程。 (要使停车工作,释放锁的线程需要知道要取消停车的线程。但您不能表示这一点。)这意味着您需要使用自旋锁1,这昂贵且不可扩展。
总而言之,您无法实现 ReadWriteLock API 或完整的重入语义。如果删除这些要求,您可以可能实现简单的读写锁(读者可重入,作者不可重入),但您需要进行自旋锁。
1 - 使用自旋锁,等待争用锁的线程 "spins" 执行忙循环,直到锁可用。当争用不太可能且持续时间很短时,这对于锁来说是可以的……或者当核心无能为力时。但是对于正常使用来说效率太低了。