从文档中还不清楚,当readLock被保存时,读者和编写线程会发生什么情况。
我说的是这个时机:
因此,问题是:
我对19位读者和1位作家进行了一次测试,几乎每一次,作者线程的表现都是等待了一段时间,然后才完成了它的虚拟工作。作者代码在下面,读者代码非常相似。
// lock is a shared StampedLock
// state is an AtomicBoolean that readers tried to 'dirty read'
def start = currentTimeMillis()
def stamp = lock.writeLock()
try {
state.set(!state.get())
def sleepTime = ThreadLocalRandom.current().nextInt(100,200)
sleep(sleepTime)
println("WRITER: I waited for ${currentTimeMillis() - start - sleepTime} ms and worked for ${sleepTime}")
} finally {
lock.unlock(stamp)
}所以,打电话给unlockRead(.)有两个意图:防止同一个线程中的死锁,并允许作者获得独占的写入器锁?
更新:下面是一个ReadWriteLock上的视频逻辑,非常类似于踩踏锁。
发布于 2019-10-28 15:59:38
任何数量的线程都可以在没有保存readLock的情况下获取writeLock。一旦请求一个写入线程,就会发生三件事(假设readLock由一个或多个线程持有)
writeLock线程的后面(防止编写器饥饿)。readLock。一旦解除了所有readLock的锁定,最后一个要解锁的线程将通知/释放等待在writeLock上的线程。
对你的问题:
作者线程是否在等待来自第一组的所有读者调用unlockRead(邮票)?因此,每个读者都可以在保存readLock时看到一致的状态(与tryOptimisticRead ->相反,如果作者来了,可能会出现不一致)?
是的,假设所有修改线程都是在writeLock下进行的,那么当线程持有一个readLock时,可以安全地假定它不会改变。
第三组的所有读者都会等待unlockWrite(邮票)的作者吗?
是的,当一个readLock被持有时,writeLock会阻塞。
https://stackoverflow.com/questions/58593682
复制相似问题