2009-07-13 67 views
3

我調用了Enqueue/Dequeue方法時,我創建了一個同步隊列,並在該隊列的SyncRoot屬性上使用SyncLock。這些方法是從標準生產者/消費者類的實例中調用的。SyncRoot上的SyncLock

這是正確使用SyncRoot屬性嗎?

更好的做法是在每個類中創建一個私有共享對象並對其進行鎖定?

請解釋你的推理。

回答

5

是的,這正是SyncRoot屬性的用途。特別是,這意味着如果創建了另一個「包裝器」集合,它可能會使用相同的SyncRoot,因此每個人仍然可以正確同步。

可以創建自己的鎖定對象,這將絕對確保沒有人在同一時間其他鎖定 - 但它也將意味着其他代碼無法安全地使用相同的收集工作。這真的取決於場景 - 其他代碼是否可以使用相同的集合?其他代碼是否受您控制?

請注意,您應該取出鎖所有操作,而不僅僅是Enqueue/Dequeue。特別是,如果你想迭代集合,你應該一直保持鎖定,因爲中間的變化會使迭代器失效。