假设我有一个字节数组,Private Data as Byte()
. 这个数组在一个类中是私有的。该类提供用于读取和写入的公共函数Data
。
这个类可以被多个线程访问,所以我想避免读取和写入不会同时发生的情况。
目前,我使用 SyncLock 来避免问题。我可以SyncLock Data
只放入写入功能,还是需要放入读取功能?或两者?
我没有具体的代码示例。我只是好奇,如果写入函数的 SyncLock 将使写入首先具有对它的独占访问权限,那么锁定读取和写入函数是否有任何好处。
假设我有一个字节数组,Private Data as Byte()
. 这个数组在一个类中是私有的。该类提供用于读取和写入的公共函数Data
。
这个类可以被多个线程访问,所以我想避免读取和写入不会同时发生的情况。
目前,我使用 SyncLock 来避免问题。我可以SyncLock Data
只放入写入功能,还是需要放入读取功能?或两者?
我没有具体的代码示例。我只是好奇,如果写入函数的 SyncLock 将使写入首先具有对它的独占访问权限,那么锁定读取和写入函数是否有任何好处。
您应该考虑使用ReaderWriterLockSlim(或ReaderWriterLock,如果您不在 .NET 4 中),而不是使用 SyncLock。
它旨在允许单个作者,但多个读者。对于您所描述的情况,这通常是理想的。
否则,您可以使用 SyncLock,但您需要锁定读取和写入操作。如果没有两者的锁定,您的阅读器可能会在编写器仍在写入时读取数据 - 这将导致您读取半集数据。
您希望锁定读取字节数组的主要原因是避免“幻像读取”或其他不可重复读取 - 如果写入器正在更新数组的中途,读取器可能会看到一些旧值和一些新值,或者一个旧值,如果它再次读取它,然后是新值。
例如,如果您有一个包含 [1, 2, 3, 4, 5, 6] 的数组,以及一个接受 aSyncLock
并在数组上循环为每个元素添加 1 的写入器线程,则没有的读取器SyncLock
可能会看到类似[2, 3, 4, 4, 5, 6] - 只有实际接受的线程SyncLock
才会获得任何安全性。