我有以下情况:我想相互排除对对象的访问。
到目前为止我通常会使用锁对象
object lockObject = new object();
...
method1: lock(lockObject) { CODE1 }
现在我还有一个可以从另一个线程调用的方法。它不应该被阻止未知的时间,而是应该在规定的时间内给出答案。
在这种情况下,我会使用监视器,例如
method2:
try{
Monitor.TryEnter(lockObject , 20000, ref lockTaken);
if (lockTaken) {CODE2}
}
catch(...){...}
finally
{
if (lockTaken) Monitor.Exit(timerLock);
}
现在我的问题是:如果锁对象相同并且相互排斥,锁和监视器是否可以以这种方式混合,或者是否需要将每个锁都更改为监视器。
那么,同一个令牌是否会两次被“锁定”,或者监视器会为该对象创建另一个令牌,然后再创建锁?
乍一看,我看不到应用程序同时在两者的代码中运行。但我不知道代码 1 和代码 2 并行执行时是否存在任何时序问题。
如果锁对象相同且互斥,lock和monitor可以这样混用吗
是的,这是完全安全的并且会起作用。
The lock { }
语句被重写为对 Monitor.Enter() 和 Monitor.Exit() 的调用。它只是简写,与using() {}
陈述。
From MSDN http://msdn.microsoft.com/en-us/library/aa664735%28v=vs.71%29.aspx:
lock (x) ...
becomes
System.Threading.Monitor.Enter(x);
try {
...
}
finally {
System.Threading.Monitor.Exit(x);
}
根据评论,在 Fx4 及更高版本中它可以使用Monitor.TryEnter()
。但上面的简单版本回答了你的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)