【问题标题】:can lock work across multiple objects in c#?可以在c#中跨多个对象锁定工作吗?
【发布时间】:2017-04-19 11:39:16
【问题描述】:

我一直在寻找一种方法来锁定一段特定的代码。

namespace x
{
   public class y
   {
      private Object obj = new Object();
      private void A()
      {
         lock(obj)
         {
            //critical section
         }
      }
   }
}

根据请求,我的应用程序从不同的来源(使用类 Y)进入方法 A,并且可以看到锁定对象未能保护关键部分。

我正在寻找保护临界区的方法,即使多个对象尝试访问这段代码并且我不想使用静态锁定对象。

请帮帮我。

【问题讨论】:

  • obj 定义为静态。

标签: c# multithreading static locking critical-section


【解决方案1】:

Lock 完成这项工作,但您锁定了一个实例字段,它只会保护您的关键部分用于同一实例。如果您想锁定所有实例,请将您的标志 (Obj) 设为静态。

namespace x 
{ 
    public class y 
    { 
        static private Object obj = new Object();

        private void A() 
        { 
            lock(obj) 
            { 
                //critical section 
            } 
        } 
    } 
}

【讨论】:

  • 嗨,托尼,感谢您的回复,但正如问题最后几行所述,我不允许使用静态对象
  • 你可以通过使用 MethodImplAttribute 和 MethodImplAttributeOptions.Synchronized 来做到这一点
  • @bourne 问题是您不能在对象之间共享实例级锁。这里需要一个单例,所以它可以是静态字段,也可以是单例的 IoC 注册
猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多