using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics ; using System.Threading ; namespace 多线程 { class 死锁问题 { public static void Main() { //由于竞态问题,我们使用了锁定,但是,锁定代来的是死锁问题,就是一个线程等待别一个线程解锁 //而别一个线程也在等待它解锁好接续操作,结果是无限等待下去,傻了B了 StateObject obj1 = new StateObject() ; StateObject obj2 = new StateObject() ; new Thread( new StateThreadExec( obj1 , obj2 ).Method1 ).Start() ; //先让第一条线程耍会再启动第二条与他抢,最后就死锁了 //过程是这样的,线程1先锁定s1 再锁定s2 ,如果2条线程同时开,第二条线程可以是在第一条锁定了s1后抢进来的,这时第一 //条线程还没锁住s2,正好让第二条抢的锁上了,这时第二条线程接着要锁s1,但是他锁不上,被第一条占了。 //再次切回第一条线程时,他要接着锁s2,他也一样锁不上,被第二条线程锁上了,等的哇 Thread.Sleep( 1000 ) ; new Thread( new StateThreadExec( obj1 , obj2 ).Method2 ).Start() ; } } class StateObject { private int state = 5; public void ChangeState(int loop) { if (state == 5) { state++; //如果值不是6时,就要执行断言显示 Trace.Assert(state == 6, "结果不为6,出现在" + loop + "次 线程名字:" + Thread.CurrentThread.Name); } state = 5; } } class StateThreadExec { StateObject s1 ; StateObject s2 ; public StateThreadExec( StateObject s1 , StateObject s2 ) { this.s1 = s1 ; this.s2 = s2 ; } public void Method1() { for (int i = 0; i < int.MaxValue; i++) { lock( s1 ) { lock( s2 ) { Console.WriteLine( "方法1在执行第" + i.ToString() + "次" ) ; s1.ChangeState(0) ; s2.ChangeState(0) ; } } } } public void Method2() { for (int i = 0; i < int.MaxValue; i++) { lock (s2) { lock (s1) { Console.WriteLine("方法2在执行第" + i.ToString() + "次"); s1.ChangeState(0); s2.ChangeState(0); } } } } } } 声明: 本文由(孤狼)原创编译,转载请保留链接: C#多线程的死锁演示
时间: 2024-11-18 15:15:04