1.创建一个工程,创建一个类命名为myThread ,里面放置一个方法,内容是num++,当num为5时,输出显示一个语句
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 线程问题__争用条件 8 { 9 class Mythread 10 { 11 public int number = 5; 12 13 public void changeNum() 14 { 15 number++; 16 if (number == 5) 17 { 18 Console.WriteLine("number这个值为5"); 19 } 20 number = 5; 21 } 22 } 23 }
2.在包含有main方法的类中,输入以下代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 using System.Threading.Tasks; 7 8 namespace 线程问题__争用条件 9 { 10 class Program 11 { 12 private static void changeNum(object o) 13 { 14 Mythread a=o as Mythread; 15 while (true) 16 { //循环调用Mythread类里面的changeNum方法 17 a.changeNum(); 18 } 19 } 20 21 22 static void Main(string[] args) 23 { 24 Mythread m=new Mythread();//创建一个新的mythread类 25 Thread t = new Thread(changeNum);//并用thread创建一个线程,调用上面的changeNum方法 26 t.Start(m);//开始调用这个t线程 27 Thread s=new Thread(changeNum);//创建一个新的线程s 28 s.Start(m);//并开始调用 29 Console.ReadKey(); 30 } 31 } 32 }
运行结果如图,它会一直调用myThread类中的那个changeNum方法,因为有两个线程,如果一个在调用的时候number为6,可能另外一个number可能为5,这时候就会调用changeNum方法中console.writeLine("number这个值为5")这个语句,所以为避免这个情况,运用锁是一个很好的方法
4.这个时候重新改写changeNum这个方法,加一个lock()判断即可
1 private static void changeNum(object o) 2 { 3 Mythread a=o as Mythread; 4 while (true) 5 { //循环调用Mythread类里面的changeNum方法 6 lock (a)//申请一个锁,如果a对象被锁定了,下面语句会暂停,其他线程会在外面等待避免冲突 7 { 8 a.changeNum(); 9 } 10 11 } 12 }
原文:http://www.cnblogs.com/pnzpb/p/5071417.html