阅读量:0
在C#中,死锁是一种常见的多线程问题,当两个或多个线程互相等待对方释放资源时,就会发生死锁。下面是一个简单的C#死锁案例分析:
using System; using System.Threading; class Program { private static object lock1 = new object(); private static object lock2 = new object(); static void Main(string[] args) { Thread t1 = new Thread(Thread1); Thread t2 = new Thread(Thread2); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine("Finished"); } static void Thread1() { lock (lock1) { Console.WriteLine("Thread1: Locked lock1"); Thread.Sleep(1000); lock (lock2) { Console.WriteLine("Thread1: Locked lock2"); } } } static void Thread2() { lock (lock2) { Console.WriteLine("Thread2: Locked lock2"); Thread.Sleep(1000); lock (lock1) { Console.WriteLine("Thread2: Locked lock1"); } } } }
在这个例子中,我们有两个线程t1
和t2
,以及两个锁对象lock1
和lock2
。Thread1
函数首先锁定lock1
,然后尝试锁定lock2
。与此同时,Thread2
函数首先锁定lock2
,然后尝试锁定lock1
。由于两个线程都在等待对方释放锁,因此发生了死锁。
为了解决这个问题,我们可以确保所有线程按照相同的顺序获取锁。修改后的代码如下:
using System; using System.Threading; class Program { private static object lock1 = new object(); private static object lock2 = new object(); static void Main(string[] args) { Thread t1 = new Thread(Thread1); Thread t2 = new Thread(Thread2); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine("Finished"); } static void Thread1() { lock (lock1) { Console.WriteLine("Thread1: Locked lock1"); Thread.Sleep(1000); lock (lock2) { Console.WriteLine("Thread1: Locked lock2"); } } } static void Thread2() { lock (lock1) // 修改这里,确保按照相同的顺序获取锁 { Console.WriteLine("Thread2: Locked lock1"); Thread.Sleep(1000); lock (lock2) { Console.WriteLine("Thread2: Locked lock2"); } } } }
现在,Thread2
函数首先尝试获取lock1
,然后再获取lock2
,这样就避免了死锁的发生。