【问题标题】:Why to use a readlock?为什么要使用读锁?
【发布时间】:2015-10-28 07:01:54
【问题描述】:

我读到写锁是独占的,而读锁是共享的,所以一段在读锁中的代码可以被多个线程访问。如果争用的线程没有获得读锁怎么办。无论如何,他们将只读。另外,如果一个线程获取一个读锁尝试写一些东西呢?

谢谢

【问题讨论】:

    标签: java multithreading readwritelock


    【解决方案1】:

    在此处复制 @Solomon Slow 评论,因为它对我个人有帮助:

    读锁和写锁成对出现:如果线程R持有读锁,它阻塞线程W 获得相应的写锁,但它不阻塞线程S 获得相同的读锁 .读/写锁对允许任意数量的读者同时“拥有”读锁,或者它允许一个写者拥有写锁,但它永远不允许一个读者和一个写者同时,并且它绝不允许同时超过一位作家。

    【讨论】:

      【解决方案2】:

      在多线程同时读写的情况下,如果线程在读取时忽略了获取锁,则可能由于同时写入而读取不一致或垃圾数据。例如,它可以在写入 long 变量的同时读取一个 long 变量,它可以读取旧值的高半部分和新值的低半部分,这意味着它读取的值将是完全垃圾,某事从来没有真正写过。

      如果一个有读锁的线程在没有写锁的情况下进行写入,可能会导致其他读取线程以类似的方式读取垃圾数据。

      【讨论】:

      • 这意味着读锁是原子的。你的意思是读锁获取线程执行写操作没有障碍?有错请指正
      • @jayendrabhatt 很难理解您的问题。你认为锁是原子的意味着什么?
      • @jayendrabhatt,读锁和写锁成对出现:如果线程 R 持有读锁,它会阻止线程 W 获得相应的写锁,但它没有阻止线程 S 获得相同的读锁。读取器/写入器锁对允许任意数量的读取器同时“拥有”读取锁,OR 它允许 一个 写入器拥有写入锁,但它绝不允许同时有一个 reader 和一个 writer,而且绝不允许同时有多个 writer。
      【解决方案3】:

      这很有趣,因为名称“readlock”或“reader-lock”可能有点误导。

      我发现将其视为模式切换更容易,您切换到只读模式只写模式。你通过获取相应的锁来切换模式。

      【讨论】:

        【解决方案4】:

        如果你想在这个表中有一行,并且你不希望任何单元格在此期间被更改,那么你可以添加一个读锁。

        其他人也可以阅读,没关系。

        【讨论】:

          猜你喜欢
          • 2011-03-27
          • 1970-01-01
          • 2012-08-13
          • 2010-09-20
          • 1970-01-01
          • 2019-06-17
          • 1970-01-01
          • 2021-12-23
          • 2018-02-15
          相关资源
          最近更新 更多