Java 你能用一个原子整数做一个读写锁吗?

Java 你能用一个原子整数做一个读写锁吗?,java,concurrency,atomic,atomicinteger,Java,Concurrency,Atomic,Atomicinteger,如果您使用位掩码将读写锁存储在单个AtomicInteger中,您能否实现快速ReadWriteLock类 它与常规的可重入写回有什么不同;DR-它不起作用 正如@Radiodef指出的,您将无法实现ReadWriteLockAPI。如果锁的状态只是单个的AtomicInteger,则诸如getOwner、getQueuedThreads等方法是不可实现的 完全重返大气层是无法实现的。重入通常需要对当前持有锁的线程的标识以及每个线程的重入计数进行编码。对于读者,我们可以使用单个计数(没有标识),

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


它与常规的可重入写回有什么不同;DR-它不起作用

  • 正如@Radiodef指出的,您将无法实现
    ReadWriteLock
    API。如果锁的状态只是单个的
    AtomicInteger
    ,则诸如
    getOwner
    getQueuedThreads
    等方法是不可实现的

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

  • 如果只使用单个
    AtomicInteger
    作为锁的状态,则不能将线程停驻在争用锁上。(为了使停止工作,释放锁的线程需要知道要对哪个线程进行解压。但您不能表示这一点。)这意味着您需要使用spinlocking1,它价格昂贵且不可扩展

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



    1-使用spinlocking,等待争用锁的线程“旋转”执行忙循环,直到锁可用。当争用不太可能且持续时间很短时,这对于锁来说是可以的。。。或者当核心无法做任何其他事情时。但是它对于正常使用来说效率太低。

    要履行
    锁的契约
    ,您至少需要有一个地方来存储对当前持有锁的线程的引用。在Java中,整数是无法做到这一点的。