【问题标题】:Can I lock the resource using the resource itself as monitor?我可以使用资源本身作为监视器来锁定资源吗?
【发布时间】:2013-01-23 10:31:54
【问题描述】:

我有一个多线程运行上下文。我希望一个资源(比如说对象 r)是互斥的。我可以将资源本身用作其监控对象吗?

例如

    lock(r)
    {
        // do something...
    }

【问题讨论】:

    标签: c# multithreading locking mutual-exclusion


    【解决方案1】:

    如果 r 始终保持同一个对象 - 例如,r 是一个 List,您要从多个线程中添加项目:

    lock (r)
    {
        r.Add("Hello world");
    }
    

    那么这很好 - 它不会引起任何问题,您可以阅读它,因为您专门“锁定r”。 (只要确保在使用r 的任何其他代码周围放置一个类似的lock。)

    但是,如果r 被切换为lock 内的另一个对象:

    lock (r)
    {
        r = new List<string>();
    }
    

    不是一个好主意,因为您最终可能会在两个不同版本的r 上运行lock 的两个线程。在这种情况下,您应该创建一个不变的object 专门用于锁定 - 您更多的是“锁定代码块”而不是“锁定r”。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多