假设我有一个类似于以下成员的类:
readonly object _locker;
我用它来同步代码块,如下所示:
lock (_locker)
{
// Do something
Monitor.Pulse(_locker);
}
还有这个:
lock (_locker)
{
while (someCondition)
Monitor.Wait(_locker);
// Do something else
}
假设我有这个特定类的多个实例,它们都使用不同的线程同时运行.
如果我将锁定器对象设置为静态,那么锁的行为和Monitor.Wait和Monitor.Pulse调用会发生什么?
static readonly object _locker;
他们都突然开始以锁步方式工作(例如,锁定一段代码会锁定对象的所有实例),或者行为没有变化?
解决方法:
通过使_locker静态,您可以创建1个共享关键区域.是的,他们都会互相等待.当您的共享数据也是静态的时,这是明智和必要的.
如果共享数据是每个实例,则不要使_locker静态.
换句话说,它取决于//做其他事情的真实代码.