过多的锁定也会有麻烦。在死锁中,至少有两个线程被挂起,并等待对方解除锁定。由于两个线程都在等待对方,就出现了死锁,线程将无限等待下去。

看下面的示例:

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: }

相关文章: