2011-02-18 2 views
12

La méthode du journal ne devrait-elle pas bloquer?Comment se fait-il que ce code ne se bloque pas?

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

double possible de [Lock aqcuired et d'autres tentatives de verrouillage ne bloque pas: des verrous C# réentrantes] (http://stackoverflow.com/questions/4846010/lock-aqcuired-and-further-attempts-to -lock-do-not-block-are-c-locks-re-entrant) –

Répondre

37

Le même fil acquiert le même verrou à deux reprises. Cela fonctionne car .NET prend en charge les verrous dits récursifs (aka reentrant mutexes).

+0

merci konrad! – Marco

+0

Pouvons-nous compter sur ce comportement restant en C#? Cela rend les choses plus simples, mais comme je ne l'ai pas vu mentionné dans les documents MSDN, je me demande s'il s'agit d'un effet secondaire lié à la mise en œuvre qui pourrait changer à l'avenir. –

3

Simple - vous utilisez un seul thread.

4

Si une ressource est verrouillée par un thread, ce thread est autorisé à entrer, même s'il possède déjà un verrou. La même chose est vraie pour cela

Object obj = new Object(); 

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

Verrouillerait si vous ne pouviez pas passer à travers en raison d'être le même fil.

Questions connexes