2012-11-22 32 views
6

tôi đang học đa luồng trong C# và tôi thấy một mã bên dướiNested khóa trong C#

static readonly object _locker = new object(); 

static void Main() 
{ 
    lock (_locker) 
    { 
    AnotherMethod(); 
    // ...some work is going on 
    } 
} 

static void AnotherMethod() 
{ 
    lock (_locker) { Console.WriteLine ("Another method"); } 
} 

Tôi tự hỏi khi nào nó đòi hỏi phải sử dụng khóa lồng nhau? Tại sao không chỉ sử dụng một khóa trong trường hợp này?

+0

nếu 'AnotherMethod' được sử dụng ở một nơi khác quá (và không chỉ trong' Main') ... – Yahia

+1

Mã này thực sự là không cần thiết. Khóa ngoài (_locker) là không cần thiết. Ngoại trừ nếu AnotherMethod() sẽ được công khai và được sử dụng từ một nơi khác. – Matthias

Trả lời

4

Phản hồi đầu tiên của tôi là có thể gọi trực tiếp AnotherMethod, không qua phương thức chính, vì vậy bạn có thể cần khóa lồng nhau.

1

Để cho phép re-entrant mã.

Ví dụ của bạn không phù hợp. Khóa được sử dụng để cung cấp quyền truy cập có kiểm soát đến critical section.

Nếu một phần quan trọng gọi một phần quan trọng khác, thì bế tắc sẽ xảy ra. Để ngăn chặn điều này, mã cho phép lại được cho phép.

Why do nested locks not cause a deadlock?

+0

Tôi không hiểu khái niệm về mã tái nhập. Mã của tôi cũng là người tham gia lại như ở đây http://stackoverflow.com/questions/391913/re-entrant-locks-in-c-sharp. Khi nào nó sẽ được sử dụng? – Alexandre

+0

http://en.wikipedia.org/wiki/Reentrancy_(computing) – Tilak