Eri*_*ric 53 .net c# deadlock locking
可能重复:
C#中的重入锁定
如果我写这样的代码:
class Program {
static void Main(string[] args) {
Foo();
Console.ReadLine();
}
static void Foo() {
lock(_lock) {
Console.WriteLine("Foo");
Bar();
}
}
static void Bar() {
lock(_lock) {
Console.WriteLine("Bar");
}
}
private static readonly object _lock = new object();
}
Run Code Online (Sandbox Code Playgroud)
我得到输出:
Foo
Bar
Run Code Online (Sandbox Code Playgroud)
我预计这会陷入僵局,因为Foo获得了一个锁,然后等待Bar获得锁.但这不会发生.
锁定机制是否只允许这个,因为代码是在同一个线程上执行的?
Ser*_*kiy 21
因为这里只有一个线程.
lock
是的捷径
bool lockWasTaken = false;
var temp = obj;
try {
Monitor.Enter(temp, ref lockWasTaken);
// your thread safe code
}
finally { if (lockWasTaken) Monitor.Exit(temp); }
Run Code Online (Sandbox Code Playgroud)
Monitor.Enter获取作为参数传递的对象的Monitor.如果另一个线程在对象上执行了Enter但尚未执行相应的Exit,则当前线程将阻塞,直到另一个线程释放该对象.如果没有阻塞,同一个线程不止一次调用Enter是合法的 ; 但是,在等待对象的其他线程将解除阻塞之前,必须调用相同数量的Exit调用.
小智 9
One word: Reentrant lock. If a thread has already acquired a lock, then it does not wait if it wants to acquire the lock again. This is very much needed otherwise it could have turned simple recursive functions into a nightmare.!