循环等待:存在一个等待资源的循环,即线程集合{P1, P2, ..., Pn}中的P1正在等待由P2占用的资源,P2正在等待由P3占用的资源,...,Pn正在等待由P1占用的资源。
using System; using System.Threading; class DeadlockExample { private static readonly object Lock1 = new object(); private static readonly object Lock2 = new object(); public static void Main() { Thread thread1 = new Thread(new ThreadStart(ThreadFunction1)); Thread thread2 = new Thread(new ThreadStart(ThreadFunction2)); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); } public static void ThreadFunction1() { lock (Lock1) { Console.WriteLine("Thread 1: Holding lock 1..."); Thread.Sleep(100); // 模拟工作 Console.WriteLine("Thread 1: Waiting for lock 2..."); lock (Lock2) { Console.WriteLine("Thread 1: Holding lock 1 & 2..."); } } } public static void ThreadFunction2() { lock (Lock2) { Console.WriteLine("Thread 2: Holding lock 2..."); Thread.Sleep(100); // 模拟工作 Console.WriteLine("Thread 2: Waiting for lock 1..."); lock (Lock1) { Console.WriteLine("Thread 2: Holding lock 2 & 1..."); } } } }在上面的代码中,线程1首先获得Lock1,然后尝试获得Lock2。同时,线程2首先获得Lock2,然后尝试获得Lock1。如果两个线程几乎同时启动,它们会进入死锁状态,因为每个线程都在等待另一个线程释放它所需要的锁。