【发布时间】:2015-10-28 07:01:54
【问题描述】:
我读到写锁是独占的,而读锁是共享的,所以一段在读锁中的代码可以被多个线程访问。如果争用的线程没有获得读锁怎么办。无论如何,他们将只读。另外,如果一个线程获取一个读锁尝试写一些东西呢?
谢谢
【问题讨论】:
标签: java multithreading readwritelock
我读到写锁是独占的,而读锁是共享的,所以一段在读锁中的代码可以被多个线程访问。如果争用的线程没有获得读锁怎么办。无论如何,他们将只读。另外,如果一个线程获取一个读锁尝试写一些东西呢?
谢谢
【问题讨论】:
标签: java multithreading readwritelock
在此处复制 @Solomon Slow 评论,因为它对我个人有帮助:
读锁和写锁成对出现:如果线程R持有读锁,它阻塞线程W 获得相应的写锁,但它不阻塞线程S 获得相同的读锁 .读/写锁对允许任意数量的读者同时“拥有”读锁,或者它允许一个写者拥有写锁,但它永远不允许一个读者和一个写者同时,并且它绝不允许同时超过一位作家。
【讨论】:
在多线程同时读写的情况下,如果线程在读取时忽略了获取锁,则可能由于同时写入而读取不一致或垃圾数据。例如,它可以在写入 long 变量的同时读取一个 long 变量,它可以读取旧值的高半部分和新值的低半部分,这意味着它读取的值将是完全垃圾,某事从来没有真正写过。
如果一个有读锁的线程在没有写锁的情况下进行写入,可能会导致其他读取线程以类似的方式读取垃圾数据。
【讨论】:
这很有趣,因为名称“readlock”或“reader-lock”可能有点误导。
我发现将其视为模式切换更容易,您切换到只读模式或只写模式。你通过获取相应的锁来切换模式。
【讨论】:
如果你想在这个表中有一行,并且你不希望任何单元格在此期间被更改,那么你可以添加一个读锁。
其他人也可以阅读,没关系。
【讨论】: