C#中Monitor对象与Lock关键字的区别分析
monitor对象
1.monitor.enter(object)方法是获取锁,monitor.exit(object)方法是释放锁,这就是monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(monitor.exit())。
2.monitor的常用属性和方法:
enter(object) 在指定对象上获取排他锁。
exit(object) 释放指定对象上的排他锁。
isentered 确定当前线程是否保留指定对象锁。
pulse 通知等待队列中的线程锁定对象状态的更改。
pulseall 通知所有的等待线程对象状态的更改。
tryenter(object) 试图获取指定对象的排他锁。
tryenter(object, boolean) 尝试获取指定对象上的排他锁,并自动设置一个值,指示是否得到了该锁。
wait(object) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。
lock关键字
1.lock关键字实际上是一个语法糖,它将monitor对象进行封装,给object加上一个互斥锁,a进程进入此代码段时,会给object对象加上互斥锁,此时其他b进程进入此代码段时检查object对象是否有锁?如果有锁则继续等待a进程运行完该代码段并且解锁object对象之后,b进程才能够获取object对象为其加上锁,访问代码段。
2.lock关键字封装的monitor对象结构如下:
try
{
monitor.enter(obj);
dosomething();
}
catch(exception ex)
{
}
finally
{
monitor.exit(obj);
}
3.锁定的对象应该声明为private static object obj = new object();尽量别用公共变量和字符串、this、值类型。
monitor和lock的区别
1.lock是monitor的语法糖。
2.lock只能针对引用类型加锁。
3.monitor能够对值类型进行加锁,实质上是monitor.enter(object)时对值类型装箱。
4.monitor还有其他的一些功能。
本文代码示例:
class program
{
private static object obj = new object();
public void locksomething()
{
lock (obj)
{
dosomething();
}
}
public void monitorsomething()
{
try
{
monitor.enter(obj);
dosomething();
}
catch(exception ex)
{
}
finally
{
monitor.exit(obj);
}
}
public void dosomething()
{
//做具体的事情
}
}