C#,多线程死锁很容易哦
这几天在看C#多线程的东东,确保多个线程不死锁是比较难的,但要死锁很容易。试着写了段死锁的代码,见下文。 环境:.NET 2.0 基本思路:学OS时的经典问题,两个线程抢占两个资源,线程1抢到了资源A,还需要资源B;线程2抢到了资源B,还需要资源A;结果就死锁了。
1usingSystem;
2usingSystem.Collections.Generic;
3usingSystem.Text;
4usingSystem.Threading;
5
6namespaceMultiThreadTest
7{
8classProgram
9{
10staticvoidMain(string[]args)
11{
12Deadlock
20}
21
23}
24
25classDeadlock
26{
27objectlocker1=newobject();
28objectlocker2=newobject();
29strings1="StartFromLocker1",s2="StartFromLocker2";
30stringl1="locker1",l2="locker2";
31
32publicvoidStartFromLocker1()
33{
34lock(locker1)
35{
36Console.WriteLine("{0}got{1}",s1,l1);
37Thread.Sleep(500);
38Console.WriteLine("{0}waitingfor{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
48publicvoidStartFromLocker2()
49{
50lock(locker2)
51{
52Console.WriteLine("{0}got{1}",s2,l2);
53Thread.Sleep(500);
54Console.WriteLine("{0}waitingfor{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优质内容筛选与推荐>>
1、学习笔记,持续更新
2、论文笔记《ImageNet Classification with Deep Convolutional Neural Network》
3、【计算机组成原理】 总线
4、A Guide to setup SQL Server Reporting Services (SSRS) with Dynamics AX
5、GridView 與 DetailsView 連動 - 繫結同一個 SqlDataSource