将储物柜对象设置为静态如何影响其行为

本文关键字:影响 对象 储物柜 设置 静态 何影响 | 更新日期: 2023-09-27 18:07:07

假设我有一个类,它的成员是这样的:

readonly object _locker;

我用它来同步代码块,像这样:

lock (_locker)
{
    // Do something
    Monitor.Pulse(_locker);
}

:

lock (_locker)
{
    while (someCondition)
        Monitor.Wait(_locker);
    // Do something else
}

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

如果我使锁对象为static,锁和Monitor.WaitMonitor.Pulse调用的行为会发生什么?

static readonly object _locker;

它们是否都突然开始同步工作(例如,锁定代码块需要在对象的所有实例中使用lock),或者行为没有变化?

将储物柜对象设置为静态如何影响其行为

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

如果共享数据是每个实例的,那么不要将_locker设置为静态。

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

该对象将在所有实例之间共享,因此如果每个对象试图获取该锁而其他对象拥有该锁,则会阻塞。