2011-02-18 12 views
12

¿No debería bloquearse el método de registro?¿Cómo es que este código no se bloquea?

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

posible duplicado de [Bloqueado y otros intentos de bloqueo no bloquean: ¿los bloqueos C# son reentrantes?] (Http://stackoverflow.com/questions/4846010/lock-aqcuired-and-further-attempts-to -lock-do-not-block-are-c-locks-re-entrant) –

Respuesta

37

El mismo hilo está adquiriendo la misma cerradura dos veces. Esto funciona porque .NET admite los llamados bloqueos recursivos (también conocidos como reentrant mutexes).

+0

gracias konrad! – Marco

+0

¿Podemos confiar en que este comportamiento permanezca en C#? Hace las cosas más simples, pero como no lo mencioné en los documentos de MSDN, me pregunto si este es un efecto secundario de implementación que puede cambiar en el futuro. –

3

Simple: se ejecuta en un único hilo.

4

Si un recurso está bloqueado por un hilo, ese hilo está permitido, incluso si ya posee un bloqueo en él. Lo mismo es cierto para este

Object obj = new Object(); 

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

Lo bloquearía si no pudiera atravesarlo en virtud de ser el mismo hilo.

Cuestiones relacionadas