我有一个类中的代码:
private static MyObject _locker = new MyObject();
...
lock (_locker)
{
...
_locker = new MyObject();
...
}
它会保持对_locker的锁定吗?
我有一个类中的代码:
private static MyObject _locker = new MyObject();
...
lock (_locker)
{
...
_locker = new MyObject();
...
}
A lock statement of the form
lock (x) ...
where x is an expression of a reference-type, is precisely equivalent to
System.Threading.Monitor.Enter(x); try { ... } finally { System.Threading.Monitor.Exit(x); }
except that x is only evaluated once.
由于x
未重新评估,所以锁将被释放。
private static readonly object _locker = new object();
private static MyObject _object;
...
lock (_locker)
{
...
_object = new MyObject();
...
}
这涉及到与您所看到的完全不同的程序流程。lock()在代码中定义了一个关键部分 - 您不能将其用作任何类型对象的通用线程安全机制(我认为您的意图是在代码中使用它来实现这种机制?)
_locker
声明为 readonly
,以防止意外重新分配。 - LukeHlock
方法时,它将保持在设置为_locker
的MyObject
实例上的锁,也就是说,它将保持在_locker
的原始实例上的锁,而不是在新创建的MyObject
实例上的锁。在下面的代码中,第一次调用lock
时,锁将保持在MyObject("OriginalInstance")
上。当第二次调用时,它将锁定MyObject("NewInstance")
。private static MyObject _locker = new MyObject("OriginalInstance");
...
lock (_locker)
{
...
_locker = new MyObject("NewInstance");
...
}
lock
的建议。
readonly
关键字标记_locker
对象。 - Steven