public class StateObject{
int state=5;
public void ChangeState(int loop)
{
if(state==5)
{
state++;
Trace.Assert(state==6,"");
}
state=5;
}
}
public class SampleThread
{
public StateObject so1;
pulbic StateObject so2;
public SampleTrhead( StateObject o1,StateObject o2)
{
this.so1=o1,this.so2=o2;
}
public void Deadlock()
{
int i=0;
while(true)
{
lock(so1)
{
lock(so2){
so1.ChangeState(i);
so2.ChangeState(i++);
Console.WriteLine("still running,{0}",i);
}
}
}
}
public void Deadlock2()
{ int i=0;
while(true)
{
lock(so2)
{
lock(so1){
so1.ChangeState(i);
so2.ChangeState(i);
Console.WriteLine("still running,{0}",i);
}
}
}
}
}
StateObject state1= new StateObject();
StateObject state2= new StateObject();
new Thread(new SampleThread(state1,state2).Deadlock1)).Start();
new Thread(new SampleThread(state1,Sate2).Deadlock2)).Start();