Nếu tôi cóỔ khóa tĩnh có hoạt động trên các lớp trẻ em khác nhau không?
abstract class Parent
{
static object staticLock = new object();
public void Method1()
{
lock(staticLock)
{
Method2();
}
}
protected abstract Method2();
}
class Child1 : Parent
{
protected override Method2()
{
// Do something ...
}
}
class Child2 : Parent
{
protected override Method2()
{
// Do something else ...
}
}
cuộc gọi đến new Child1().Method1()
và new Child2().Method1()
sẽ sử dụng khóa giống nhau không?
Và staticLock là "riêng tư" (mặc định cho các thành viên http://msdn.microsoft.com/en-us/library/ms173121.aspx), do đó không thể truy cập được bởi các lớp con. –
@AlexeiLevenkov Tôi chỉ muốn bảo đảm rằng chỉ có một 'Method2' đang được gọi vào bất kỳ khoảnh khắc nào, tôi không cần các lớp con truy cập nó. –
@JohnSaunders: Tôi không theo dõi bạn. Ý tưởng ở đây là có phương thức * công khai * * không thể ghi đè * để đảm bảo rằng * người gọi * luôn lấy khóa. Bằng cách đó, các tác giả của các lớp dẫn xuất có thể thực hiện Method2 mà không cần phải nhớ "oh yeah, tôi phải lấy khóa ở đây". Mô hình này loại bỏ một loại lỗi nhưng tất nhiên nó tạo ra cơ hội cho người khác; bây giờ các tác giả của các lớp dẫn xuất đó cần biết rằng khóa lớp cha được lấy và không gây ra bế tắc trên đó. –