Monitor实例--tryenter解除死锁

        在多线程编程里面,经常出现的两个问题:一个是共享资源(异步之后的同步),另外一个是死锁。用到lock和monitor .enter(obj)进行资源同步时,如果控制不好如意出现死锁现象:lock(A),lock(B),lock(C),三个对象都被上锁都在互相的带对方释放资源,lock不得不到资源不会自动解锁(monitor.enter(obj)也是这样),死锁就发生了。那我们会想如何能自动在规定的时间内得不到资源就把锁住的资源释放到供其他线程进行调用呢?那就是monitor.tryenter(obj,timeout)(obj是锁住的资源,timeout是等待时间,时间一到如果还没有得到资源就自动释放锁),先来看一段实例:

<pre name="code" class="html">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Monitor_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            student stu=new student();
            Thread t1 = new Thread(new ThreadStart(stu.add_I));
            Thread t2 = new Thread(new ThreadStart(stu.add_I));
            t1.Start();
            t2.Start();
        }
    }
    class student
    {
        int i;
        public void add_I()
        {
            try
            {
                Monitor.TryEnter(this, 800);//时间一到自动释放锁
                //Monitor.Enter(this);
                i++;
                Console.WriteLine("开始睡眠1秒钟!");
                Thread.Sleep(1000);
                Console.WriteLine(i.ToString());
                Monitor.Exit(this);//如果超时没有做处理,到执行这一步的时候会出错的!(如下图正常输出结果是1,2,但是现在一次输出2,2,可以将timeout由800改成1500再试试)
            }
            catch(Exception ee)
            {
                Console.WriteLine(ee.Message.ToString());
            }
            finally
            {
                //Monitor.Exit(this);//如果超时没有做处理,到执行这一步的时候会出错的!
            }
        }
    }
}
 

         运行结果如下:

       



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值