通过多线程可以让效率提升,若大一个仓库装有许多粮食,工人负责把粮食一袋一袋的运到货车上以便卖给分销商。当一个工人的时候,不会发生什么潜在问题,也就是所谓的“单线程”。但是为了提高工作效率,又招了一个(升级为多线程),现在由工人甲、工人乙进行从仓库往货车上背粮食,一直相安无事,结果有一天两人发生了一点小矛盾,导至两人干活总是较着劲,工人甲一开始比工人乙快一些,但是在卸完肩上的粮食之后,忽感腰间一疼,再感又没有事情了,这一缓之际工人乙也把粮食卸到了货车上,于是现在两人速度一样,当两人来到仓库时,莫名的两人竟然同时抓到了同一个粮袋,要放在以前两人肯定会谦让,但是由于现在二人有些矛盾,所以互不相让,这可以看成是线程中的“竟态条件”。老板为了不让二人同时抓取同一个粮袋,在仓库门口修建了一个三米长的狭窄通道,通道只容单人次通过,于是二人由原来的分散状态形成了现在一前一后的效果,倒是再也没有出现同时抓到同一袋粮食的状况(线程同步),可好景不长,由于三米的通道每次只容纳一人直行,无法两人并行,结果这次工人乙比工人甲快出许多,在工人甲刚刚从仓库里背出一袋粮食进入通道时,工人乙也从外出卸完粮食回来了,两人谁也不相让,就这样一直耗着。这就是所谓的线程“死锁”。罗里八嗦的说了这么一堆,其实主要是把线程的一些特性用白话总结了一下,下面用代码将线程死锁表现出来:
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++);
}
}
}
}
}
}
|