打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#多线程的死锁演示
[c-sharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Diagnostics ;  
  6. using System.Threading ;  
  7.   
  8. namespace 多线程  
  9. {  
  10.     class 死锁问题  
  11.     {  
  12.         public static void Main()  
  13.         {  
  14.             //由于竞态问题,我们使用了锁定,但是,锁定代来的是死锁问题,就是一个线程等待别一个线程解锁  
  15.             //而别一个线程也在等待它解锁好接续操作,结果是无限等待下去,傻了B了  
  16.             StateObject obj1 = new StateObject() ;  
  17.             StateObject obj2 = new StateObject() ;  
  18.             new Thread( new StateThreadExec( obj1 , obj2 ).Method1 ).Start() ;  
  19.             //先让第一条线程耍会再启动第二条与他抢,最后就死锁了  
  20.             //过程是这样的,线程1先锁定s1 再锁定s2 ,如果2条线程同时开,第二条线程可以是在第一条锁定了s1后抢进来的,这时第一  
  21.             //条线程还没锁住s2,正好让第二条抢的锁上了,这时第二条线程接着要锁s1,但是他锁不上,被第一条占了。  
  22.             //再次切回第一条线程时,他要接着锁s2,他也一样锁不上,被第二条线程锁上了,等的哇  
  23.             Thread.Sleep( 1000 ) ;  
  24.             new Thread( new StateThreadExec( obj1 , obj2 ).Method2 ).Start() ;  
  25.         }  
  26.     }  
  27.   
  28.     class StateObject  
  29.     {  
  30.         private int state = 5;  
  31.   
  32.         public void ChangeState(int loop)  
  33.         {  
  34.             if (state == 5)  
  35.             {  
  36.                 state++;  
  37.                 //如果值不是6时,就要执行断言显示  
  38.                 Trace.Assert(state == 6, "结果不为6,出现在" + loop + "次 线程名字:" + Thread.CurrentThread.Name);  
  39.             }  
  40.   
  41.             state = 5;  
  42.         }  
  43.     }  
  44.   
  45.     class StateThreadExec  
  46.     {  
  47.         StateObject s1 ;  
  48.         StateObject s2 ;  
  49.   
  50.         public StateThreadExec( StateObject s1 , StateObject s2 )  
  51.         {  
  52.             this.s1 = s1 ;  
  53.             this.s2 = s2 ;  
  54.         }  
  55.   
  56.         public void Method1()  
  57.         {  
  58.             for (int i = 0; i < int.MaxValue; i++)  
  59.             {  
  60.                 lock( s1 )  
  61.                 {  
  62.                     lock( s2 )  
  63.                     {  
  64.                         Console.WriteLine( "方法1在执行第" + i.ToString()  + "次" ) ;  
  65.                         s1.ChangeState(0) ;  
  66.                         s2.ChangeState(0) ;  
  67.                     }  
  68.                 }  
  69.             }  
  70.         }  
  71.   
  72.         public void Method2()  
  73.         {  
  74.             for (int i = 0; i < int.MaxValue; i++)  
  75.             {  
  76.                 lock (s2)  
  77.                 {  
  78.                     lock (s1)  
  79.                     {  
  80.                         Console.WriteLine("方法2在执行第" + i.ToString() + "次");  
  81.                         s1.ChangeState(0);  
  82.                         s2.ChangeState(0);  
  83.                     }  
  84.                 }  
  85.             }  
  86.         }  
  87.     }  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
多线程的死锁
Java线程的深入探讨
建立vb.net多线程的初步应用
Python:使用threading模块实现多线程编程
Java程序员面试中的多线程问题
Java线程面试题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服