Với lớp sau đây:Nhiều đối tượng khóa cần thiết?
class x
{
Object lockOne = new Object();
Object lockTwo = new Object();
List<Something> listOne = new List<Something>();
List<Something> listTwo = new List<Something>();
void MethodOne()
{
lock(lockOne)
{
// some operation on listOne
}
}
void MethodTwo()
{
lock(lockTwo)
{
// some operation on listTwo
}
}
}
Là nó đúng để sử dụng hai đối tượng khóa giả định rằng MethodOne()
và MethodTwo()
thể được gọi từ chủ đề khác nhau đồng thời lưu ý rằng listOne
và listTwo
không liên quan trong anyway. Các hoạt động duy nhất liên quan đến khóa là những hoạt động được nêu trong các chú thích ở trên.
Nó được gọi là tách khóa và là cách tốt để giảm ganh đua nếu hai đối tượng và phương pháp độc lập. – assylias
Nó nên được gọi là cảm giác thông thường, làm theo cách khác xung quanh là một thực hành rất xấu. – Dariusz
Một điều bạn có thể muốn xem xét là sử dụng [ReaderWriterLock] (http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx). Nếu bạn chỉ đọc từ danh sách nó cho phép nhiều chủ đề sử dụng nó cùng một lúc ('List' có chủ đề đọc an toàn), một khi bạn cần viết bạn nâng cấp khóa và sau đó chỉ có một luồng có thể ghi và tất cả các độc giả bị chặn, sau đó nhiều người đọc có thể bắt đầu lại. –