如何使锁定对象静态影响其行为?

时间:2011-08-31 23:04:14

标签: c# multithreading locking

假设我的班级成员看起来像这样:

readonly object _locker;

我用来同步这样的代码块:

lock (_locker)
{
    // Do something

    Monitor.Pulse(_locker);
}

和此:

lock (_locker)
{
    while (someCondition)
        Monitor.Wait(_locker);

    // Do something else
}

假设我有这个特定类的多个实例,所有实例都在同一时间运行,使用不同的线程。

如果我制作了锁定对象Monitor.Wait,那么锁和Monitor.Pulsestatic调用的行为会怎样?

static readonly object _locker;

他们是否突然开始以锁步方式工作(例如,锁定一段代码在对象的所有实例中占用lock),或者行为没有变化?

2 个答案:

答案 0 :(得分:5)

通过设置_locker静态,您可以创建1个共享关键区域。是的,他们都会互相等待。当您的共享数据也是静态的时,这是明智和必要的。

如果共享数据是按实例进行的,则不要使_locker静态。

换句话说,这取决于// Do something else的实际代码是什么。

答案 1 :(得分:2)

该对象将在所有实例之间共享,因此如果每个对象尝试获取锁定并且任何其他对象都拥有它,则每个对象都将被阻塞。