2012-02-19 63 views
0
class Class1 
    { 
     private static object consoleGate = new Object(); 

     private static void Trace(string msg) 
     { 
      lock (consoleGate) 
      { 
       Console.WriteLine("[{0,3}/{1}]-{2}:{3}", Thread.CurrentThread.ManagedThreadId, 
        Thread.CurrentThread.IsThreadPoolThread ? "pool" : "fore", 
        DateTime.Now.ToString("HH:mm:ss.ffff"), msg); 
      } 
     } 
     private static void ProcessWorkItems() 
     { 
        lock (consoleGate) 
        { 
         for (int i = 0; i < 5; i++) 
         { 
          Trace("Processing " + i); 
          Thread.Sleep(250); 
         } 
        } 
      Console.WriteLine("Terminado."); 

     } 
     static void Main() 
     { 
      ProcessWorkItems(); Console.ReadLine(); 
     } 
    } 

输出:同步线程:这里有冲突吗?

Processing 0 
Processing 1 
Processing 2 
Processing 3 
Processing 4 
Terminated 

这是为什么代码工作? ProcessWorkItems静态方法锁定ConsoleGate对象和Trace做的一样。我以为这个物体只能被锁定一次。 ¿一些解释?

回答

4

C#中的锁是可重入的 - 单个线程可以多次获取相同的锁而不会阻塞。正弦你只有一个线程在这里没有问题 - 锁是用来同步跨多个线程资源的访问。

MSDN documentationlock

锁定关键字可确保在另一个线程是在临界段一个线程不进入代码的临界 部。如果 另一个线程试图输入一个锁定代码,它将等待,阻止, ,直到对象被释放。

有关重入锁的更多信息请参阅本SO螺纹:"What is the Re-entrant lock and concept in general?"

1

所有你已经在这里显示的代码是相同的线程上运行。这就是为什么它运行就像它会如果你没有使用“锁定”