SyncRoot上的SyncLock

use*_*755 3 vb.net multithreading synclock

我已经创建了一个同步队列,并在调用Enqueue/Dequeue方法时在该队列的SyncRoot属性上使用SyncLock.从标准生产者/消费者类的实例调用这些方法.

这是SyncRoot属性的正确使用吗?

更好的做法是在每个类中创建一个私有共享对象并锁定它吗?

请解释一下你的推理.

Jon*_*eet 6

是的,这正是该SyncRoot物业的用途.特别是,这意味着如果创建了另一个"包装器"集合,它可能会使用相同的SyncRoot,所以每个人仍然可以正确同步.

可以创建自己的锁定对象,这样可以绝对确保没有其他人同时锁定 - 但这也意味着其他代码无法安全地使用相同的集合.这真的取决于场景 - 其他代码是否能够使用相同的集合?您可以控制其他代码吗?

请注意,您应该为所有操作取出锁定,而不仅仅是Enqueue/Dequeue.特别是,如果你想迭代集合,你应该持有整个时间的锁,因为中间的更改将使迭代器无效.