线程问题——争用条件和死锁

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         }

 

转载于:https://www.cnblogs.com/pnzpb/p/5071417.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值