一、简介 Lock关键字是Monitor的一种替换用法,lock在IL代码中会被翻译成Monitor. lock (obj) { //代码
Lock关键字是Monitor的一种替换用法,lock在IL代码中会被翻译成Monitor.
lock (obj)
{
//代码段
}
//就等同于
Monitor.Enter(obj);
//代码段
Monitor.Exit(obj);
Monitor的常用属性和方法:
常用的方法有两个
这就是Monitor最常用的两个方法,在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit())。
Enter(Object)的用法很简单,看代码
class Program
{
static void Main(string[] args)
{
Thread threadA = new Thread(ThreadMethod);
threadA.Name = "A";
Thread threadB = new Thread(ThreadMethod);
threadB.Name = "B";
threadA.Start();
threadB.Start();
Thread.CurrentThread.Name = "C";
ThreadMethod();
Console.ReadKey();
}
static object obj = new object();
public static void ThreadMethod()
{
Monitor.Enter(obj); //Monitor.Enter(obj) 鎖定对象
try
{
for (int i = 1; i <= 10; i++)
{
Console.Write(Thread.CurrentThread.Name + ":" + i + "\t");
}
Console.WriteLine();
}
catch (Exception ex)
{
}
finally
{
Monitor.Exit(obj); // Monitor.Exit(obj); 释放鎖定对象
}
}
}
执行结果:
TryEnter(Object)和TryEnter()方法在尝试获取一个对象上的显式锁方面和 Enter()方法类似。然而,它不像Enter()方法那样会阻塞执行。如果线程成功进入关键区域那么TryEnter()方法会返回true. 和试图获取指定对象的排他锁。看下面代码演示:
class Program
{
static void Main(string[] args)
{
Thread threadA = new Thread(ThreadMethod);
threadA.Name = "A";
Thread threadB = new Thread(ThreadMethod);
threadB.Name = "B";
threadA.Start();
threadB.Start();
Thread.CurrentThread.Name = "C";
ThreadMethod();
Console.ReadKey();
}
static object obj = new object();
public static void ThreadMethod()
{
bool flag = Monitor.TryEnter(obj, 1000);
//设置1S的超时时间,如果在1S之内没有获得同步锁,则返回false
//上面的代码设置了锁定超时时间为1秒,也就是说:
//如果在1秒中后,lockObj还未被解锁,TryEntry方法就会返回false,如果在1秒之内,lockObj被解锁,TryEntry返回true。我们可以使用这种方法来避免死锁
try
{
if (flag)
{
for (int i = 1; i <= 10; i++)
{
Console.Write(Thread.CurrentThread.Name + ":" + i + "\t");
}
Console.WriteLine();
}
}
catch (Exception ex)
{
}
finally
{
if (flag)
Monitor.Exit(obj); // Monitor.Exit(obj); 释放鎖定对象
}
}
}
执行结果:
通过Monitor.TryEnter(monster, 1000),该方法也能够避免死锁的发生,我们上面的例子用到的是该方法的重载,Monitor.TryEnter(Object,Int32)。
为了能避免多线程死锁的发生,尽量用TryEnter(Object)和TryEnter()方法在尝试获取一个对象上的显式锁。
到此这篇关于C#使用Monitor类实现线程同步的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。
--结束END--
本文标题: C#使用Monitor类实现线程同步
本文链接: https://www.lsjlt.com/news/146559.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0