gpt4 book ai didi

java - Java StampedLock : what happens to writer while someone is reading

转载 作者:行者123 更新时间:2023-12-03 12:58:52 25 4
gpt4 key购买 nike

从文档中还不清楚,如果在保持readLock的情况下尝试进行写入操作,那么读写器线程会发生什么情况。

我说的是这个时机:

  • 阅读器线程(或某些阅读器线程)进入并获取readlock,目的是在某些多字段对象
  • 上调用一些 setter/getter
  • 在 setter/getter 组的中间出现Writer线程,并要求使用writeLock,并打算
    显着改变对象状态
  • 另外,更多的读者有意获取readlock并调用所有获取方法的人

  • 因此,问题是:
  • (似乎是)编写器线程是否在等待第1组中的所有阅读器调用unlockRead(stamp)?因此,保证每个阅读器在持有readLock时都可以看到一致的状态(与tryOptimisticRead->相对,据说如果写者到来,可能会出现不一致的情况)?

  • 我用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)
    }
  • (最肯定的是,是的,但仍然提到),第3组的所有读者都将等待作者解锁Write(stamp)吗?

  • 因此,调用unlockRead(...)有两个目的:防止在同一线程中发生死锁,并允许编写者获得独占的编写者锁?

    更新:这是一个 video on ReadWriteLock-逻辑与Stampedlock非常相似

    最佳答案

    在不保留readLock的情况下,任何数量的线程都可以获取writeLock。一旦请求写线程,就会发生三件事(假设readLock被一个或多个线程持有)

  • writeLock线程已暂停
  • 来自非读取锁定线程的所有readLock请求都在writeLock线程后面排队(防止作家饿死)
  • 任何读取锁定线程都可以对同一锁进行readLock(可重入)。

  • 一旦所有 readLock都被解锁,那么最后一个要解锁的线程将通知/释放等待 writeLock的线程。

    对您的问题:

    Is writer thread waiting for all readers from group 1 to call unlockRead(stamp)? So each reader is guaranteed to see consistent state while holding readLock (opposed to tryOptimisticRead -> it's stated that inconsistencies may occur if a writer comes)?



    是的,假设所有修改线程都在 writeLock下执行此操作,那么当线程持有 readLock时,可以安全地假定它不会更改。

    will all readers from group 3 wait for writer to unlockWrite(stamp) ?



    是的,在保存 readLockwriteLock将阻止。

    关于java - Java StampedLock : what happens to writer while someone is reading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58593682/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com