假设我的班级成员看起来像这样:
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
调用的行为会怎样?
static readonly object _locker;
他们是否突然开始以锁步方式工作(例如,锁定一段代码在对象的所有实例中占用lock
),或者行为没有变化?
答案 0 :(得分:5)
通过设置_locker
静态,您可以创建1个共享关键区域。是的,他们都会互相等待。当您的共享数据也是静态的时,这是明智和必要的。
如果共享数据是按实例进行的,则不要使_locker
静态。
换句话说,这取决于// Do something else
的实际代码是什么。
答案 1 :(得分:2)
该对象将在所有实例之间共享,因此如果每个对象尝试获取锁定并且任何其他对象都拥有它,则每个对象都将被阻塞。