C#,多线程死锁很容易哦
原文写于:2008-02-04
这几天在看C#多线程的东东,确保多个线程不死锁是比较难的,但要死锁很容易。试着写了段死锁的代码,见下文。 环境:.NET 2.0 基本思路:学OS时的经典问题,两个线程抢占两个资源,线程1抢到了资源A,还需要资源B;线程2抢到了资源B,还需要资源A;结果就死锁了。
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Threading;
5![]()
6namespace MultiThreadTest
7{
8class Program
9{
10static void Main(string[] args)
11{
12Deadlock
20}
21![]()
23}
24![]()
25class Deadlock
26{
27object locker1 = new object();
28object locker2 = new object();
29string s1="StartFromLocker1", s2="StartFromLocker2";
30string l1 = "locker1", l2 = "locker2";
31![]()
32public void StartFromLocker1()
33{
34lock(locker1)
35{
36Console.WriteLine("{0} got {1}", s1, l1);
37Thread.Sleep(500);
38Console.WriteLine("{0} waiting for {1}", s1, l2);
39lock(locker2)
40{
41Console.WriteLine("{0} got {1}", s1, l2);
42Thread.Sleep(500);
43}
44}
45Console.WriteLine("leaving {0}", s1);
46}
47![]()
48public void StartFromLocker2()
49{
50lock (locker2)
51{
52Console.WriteLine("{0} got {1}", s2, l2);
53Thread.Sleep(500);
54Console.WriteLine("{0} waiting for {1}", s2, l1);
55lock (locker1)
56{
57Console.WriteLine("{0} got {1}", s2, l1);
58Thread.Sleep(500);
59}
60}
61Console.WriteLine("leaving {0}", s2);
62}
63};
64}
运行结果:
StartFromLocker1 got locker1 StartFromLocker2 got locker2 StartFromLocker1 waiting for locker2 StartFromLocker2 waiting for locker1