| 通过多线程可以让效率提升,若大一个仓库装有许多粮食,工人负责把粮食一袋一袋的运到货车上以便卖给分销商。当一个工人的时候,不会发生什么潜在问题,也就是所谓的“单线程”。但是为了提高工作效率,又招了一个(升级为多线程),现在由工人甲、工人乙进行从仓库往货车上背粮食,一直相安无事,结果有一天两人发生了一点小矛盾,导至两人干活总是较着劲,工人甲一开始比工人乙快一些,但是在卸完肩上的粮食之后,忽感腰间一疼,再感又没有事情了,这一缓之际工人乙也把粮食卸到了货车上,于是现在两人速度一样,当两人来到仓库时,莫名的两人竟然同时抓到了同一个粮袋,要放在以前两人肯定会谦让,但是由于现在二人有些矛盾,所以互不相让,这可以看成是线程中的“竟态条件”。老板为了不让二人同时抓取同一个粮袋,在仓库门口修建了一个三米长的狭窄通道,通道只容单人次通过,于是二人由原来的分散状态形成了现在一前一后的效果,倒是再也没有出现同时抓到同一袋粮食的状况(线程同步),可好景不长,由于三米的通道每次只容纳一人直行,无法两人并行,结果这次工人乙比工人甲快出许多,在工人甲刚刚从仓库里背出一袋粮食进入通道时,工人乙也从外出卸完粮食回来了,两人谁也不相让,就这样一直耗着。这就是所谓的线程“死锁”。罗里八嗦的说了这么一堆,其实主要是把线程的一些特性用白话总结了一下,下面用代码将线程死锁表现出来: using System;
 using System.Threading;
 namespace zuo_Company.MyDidLockProject{
 public class TestThread{
 static void Main(string[] args){
 Shareds sa = new Shareds(333);
 Shareds sb = new Shareds(666);
 
 //SharedThread sd = new SharedThread(sa,sb);
 //new Thread(sd.ThreadRunA).Start();
 //new Thread(sd.ThreadRunB).Start();
 
 new Thread(new SharedThread(sa,sb).ThreadRunA).Start();
 new Thread(new SharedThread(sa,sb).ThreadRunB).Start();
 
 Console.WriteLine("Main method over!");
 }
 }
 
 public class Shareds{
 private int Id;
 
 public Shareds():this(1){}
 public Shareds(int x){
 this.Id = x;
 }
 public override string ToString(){
 return "Id:"+this.Id;
 }
 }
 
 public class SharedThread{
 private Shareds s1;
 private Shareds s2;
 
 public SharedThread(Shareds s1,Shareds s2){
 this.s1 = s1;
 this.s2 = s2;
 }
 
 public void ThreadRunA(){
 int count = 0;
 while(true){
 lock(s1){
 lock(s2){
 Console.WriteLine("--------------\r\nThreadRunA:");
 Console.WriteLine(s1.ToString());
 Console.WriteLine(s2.ToString());
 Console.WriteLine("Counts:{0}\r\n",count++);
 }
 }
 }
 }
 
 public void ThreadRunB(){
 int count = 0;
 while(true){
 lock(s2){
 lock(s1){
 Console.WriteLine("--------------\r\nThreadRunB:");
 Console.WriteLine(s1.ToString());
 Console.WriteLine(s2.ToString());
 Console.WriteLine("Counts:{0}\r\n",count++);
 }
 }
 }
 }
 }
 }
 
 |