2011-02-18 119 views
12

不應該日誌方法塊?這段代碼怎麼沒有死鎖?

namespace Sandbox { 
class Program { 
    static void Main(string[] args) { 
     var log = new Logger(); 
     lock (log) { 
      log.Log("Hello World!"); 
     } 
    } 
} 

public class Logger { 
    public void Log(string message) { 
     lock (this) { 
      Console.WriteLine(message); 
     } 
    } 
} 

}

+2

可能重複的[鎖定aqcuired和進一步嘗試鎖定不會阻止:是C#鎖再入?](http://stackoverflow.com/questions/4846010/lock-aqcuired-and-further-attempts-to -lock-do-not-block-are-c-locks-re-entrant) – 2011-02-18 20:06:28

回答

37

同一線程被獲取同一個鎖兩次。這是可行的,因爲.NET支持所謂的遞歸鎖定(又名reentrant mutexes)。

+0

謝謝konrad! – Marco 2011-02-18 19:57:11

3

簡單 - 您正在單線程中運行。

4

如果一個資源被某個線程鎖定,該線程被允許進入,即使它已經擁有一個鎖。

Object obj = new Object(); 

lock(obj) { 
    lock(obj) { 
     foo(); 
    } 
} 

如果因爲是同一個線程而無法通過,會鎖定。