2010-03-09 114 views

回答

32
static object object1 = new object(); 
static object object2 = new object(); 

public static void ObliviousFunction() 
{ 
    lock (object1) 
    { 
     Thread.Sleep(1000); // Wait for the blind to lead 
     lock (object2) 
     { 
     } 
    } 
} 

public static void BlindFunction() 
{ 
    lock (object2) 
    { 
     Thread.Sleep(1000); // Wait for oblivion 
     lock (object1) 
     { 
     } 
    } 
} 

static void Main() 
{ 
    Thread thread1 = new Thread((ThreadStart)ObliviousFunction); 
    Thread therad2 = new Thread((ThreadStart)BlindFunction); 

    thread1.Start(); 
    thread2.Start(); 

    while (true) 
    { 
     // Stare at the two threads in deadlock. 
    } 
} 
+0

+1,我來到這個問題來描述這樣的事情。在實踐中鎖定購買順序是一個非常普遍的問題。經驗法則:如果您需要同時持有2個鎖,則應該以可預測的和一致的順序獲取並釋放它們。 – asveikau 2010-03-09 18:40:50

6

Threading in C#

在天平的另一端, 單獨的同步的上下文 邀請死鎖。這裏有一個例子:

[Synchronization] 
public class Deadlock : ContextBoundObject { 
    public DeadLock Other; 
    public void Demo() { Thread.Sleep (1000); Other.Hello(); } 
    void Hello() { Console.WriteLine ("hello"); } 
} 
public class Test { 
    static void Main() { 
    Deadlock dead1 = new Deadlock(); 
    Deadlock dead2 = new Deadlock(); 
    dead1.Other = dead2; 
    dead2.Other = dead1; 
    new Thread (dead1.Demo).Start(); 
    dead2.Demo(); 
} 

由於死鎖的每個實例中測試創建 - 一個 非同步類 - 每個實例 意志都有自己的同步 背景下,因此,自己的鎖。當 兩個對象呼籲對方, 它並不需要很長時間的僵局 發生(一秒,要準確!) 如果僵局,測試 類被寫入的問題會特別 陰險不同的編程團隊 。它可能是 不合理,期望那些負責測試類的 甚至知道他們的越界,讓 知道如何去解決 它。這與明確的 鎖相反,其中死鎖通常是 更明顯。