在多线程编程里面,经常出现的两个问题:一个是共享资源(异步之后的同步),另外一个是死锁。用到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);//如果超时没有做处理,到执行这一步的时候会出错的!
}
}
}
}
运行结果如下: