Tôi đang xem xét một mã ví dụ trong một cuốn sách và đi qua đoạn mã sau (đơn giản hóa). Trong mã, khi Subscribe(T subscriber)
được gọi, luồng đi vào phần khóa. và sau đó, khi mã bên trong khóa gọi phương thức AddToSubscribers(T subscriber)
, phương thức có khóa khác. tại sao khóa thứ hai này lại cần thiết?lý do đằng sau khóa bên trong khóa?
public abstract class SubscriptionManager<T> where T : class
{
private static List<T> subscribers;
private static void AddToSubscribers(T subscriber)
{
lock (typeof(SubscriptionManager<T>))
{
if (subscribers.Contains(subscriber))
return;
subscribers.Add(subscriber);
}
}
public void Subscribe(T subscriber)
{
lock (typeof(SubscriptionManager<T>))
{
AddToSubscribers(subscriber);
}
}
}
thực sự, ví dụ này xuất phát từ một cuốn sách WCF, và lớp SubscriptionManager là lớp cơ sở cho dịch vụ WCF các lớp học. do đó các phương thức thể hiện được yêu cầu. Tôi cũng đọc từ MSDN rằng khóa trên một loại là nguy hiểm như bạn đã nêu, thực tế là bối cảnh là WCF làm cho bất kỳ sự khác biệt? –
Yeonho
@Daniel không gì cả. –
@Marc "đối tượng đọc riêng tĩnh syncLock = new object();" - điều này cho một khóa toàn cầu duy nhất cho tất cả SubscriptionManager; trong khi tôi tin rằng mã ban đầu có một khóa cho mỗi loại được xây dựng (tức là một khóa cho mỗi "T" riêng biệt). –
Joe