4

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

谢谢

4

4 回答 4

6

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

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

于 2015-10-28T07:09:35.270 回答
5

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

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

于 2019-02-11T15:08:03.677 回答
1

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

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

于 2019-02-21T07:39:03.433 回答
0

就像如果您想要此表中的一行,并且您不希望在此期间更改任何单元格,那么您可以添加一个读锁。

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

于 2022-03-02T13:01:13.097 回答