过多的锁定也会有麻烦。在死锁中,至少有两个线程被挂起,并等待对方解除锁定。由于两个线程都在等待对方,就出现了死锁,线程将无限等待下去。
看下面的示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
8:
namespace ThreadingIssues
10: {
class StateObject
12: {
int state = 5;
object();
/// <summary>
/// 当state等于5时,改变state的值
/// </summary>
int loop)
20: {
lock (sync)
22: {
if (state == 5)
24: {
25: state++;
);
27: }
28: }
29: state = 5;
30: }
31: }
32:
class SampleThread
34: {
private StateObject s1;
private StateObject s2;
37:
public SampleThread(StateObject s1,StateObject s2)
39: {
this.s1 = s1;
this.s2 = s2;
42: }
43:
void Deadlock1()
45: {
int i = 0;
true)
48: {
lock (s1)
50: {
lock (s2)
52: {
53: s1.ChangeState(i);
54: s2.ChangeState(i++);
,i);
56: }
57: }
58: }
59: }
60:
void Deadlock2()
62: {
int i = 0;
true)
65: {
lock (s2)
67: {
lock (s1)
69: {
70: s1.ChangeState(i);
71: s2.ChangeState(i++);
, i);
73: }
74: }
75: }
76: }
77: }
78:
class Program
80: {
string[] args)
82: {
new StateObject();
new StateObject();
new SampleThread(state1, state2).Deadlock1).Start();
new SampleThread(state1, state2).Deadlock2).Start();
87: }
88: }
89: }