C#中的线程死锁示例

有人能给出一个如何在C#语言中引起线程死锁的例子吗?

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. } } 

来自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(); } 

因为死锁的每个实例都是在Test中创建的 – 一个不同步的类 – 每个实例都将获得自己的同步上下文,因此也会获得自己的锁。 当两个对象相互调用时,不会发生死锁(确切地说是一秒钟!)如果死锁和测试类是由不同的编程团队编写的,那么问题就会特别隐蔽。 期望那些负责测试课程的人甚至意识到他们的违规行为可能是不合理的,更不用说知道如何解决它。 这与显式锁相反,其中死锁通常更明显。