首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中锁定(或进入/退出)的最佳实践

在C#中锁定(或进入/退出)的最佳实践
EN

Stack Overflow用户
提问于 2011-05-04 12:24:52
回答 2查看 3K关注 0票数 5

我有一个测量仪器对象:

代码语言:javascript
运行
复制
public class Instrument
{
  public double Measure() 
  { 
    return 0; 
  }
}

我有一个设备需要做一些测量:

代码语言:javascript
运行
复制
public class Device
{
  public Instrument MeasuringInstrument { get; set; }
  public void DoMeasuring()
  {
    var result = this.MeasuringInstrument.Measure();
  }
}

测量仪器一次只能在一个设备上操作,但许多设备可以使用同一仪器。我对线程是个新手,据我所知,以下两种解决方案都有一些注意事项。

代码语言:javascript
运行
复制
public class Instrument
{
  public double Measure() 
  { 
    lock(this)
    {
      return 0; 
    }
  }
}

public class Device
{
  public Instrument MeasuringInstrument { get; set; }
  public void DoMeasuring()
  {
    lock(this.MeasurementInstrument)
    {
      var result = this.MeasuringInstrument.Measure();
    }
  }
}

我读过,最好锁定私有对象,但我不知道如何做到这一点,同时仍然允许在设备上获取/设置MeasuringInstrument。有什么建议吗?

非常感谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-04 12:33:00

通常的模式是创建您自己的私有object,以便在明显的选择可能暴露在类之外的情况下进行锁定,例如:

代码语言:javascript
运行
复制
public class Instrument
{
    private object thisLock = new object();

    public double Measure() 
    { 
        lock(this.thisLock)
        {
            return 0; 
        }
    }
}

public class Device
{
    public Instrument MeasuringInstrument { get; set; }
    private object measuringInstrumentLock = new object();

    public void DoMeasuring()
    {
        lock(this.measuringInstrumentLock)
        {
            var result = this.MeasuringInstrument.Measure();
        }
    }
}

此外,我怀疑您只需要这两个锁中的一个(要么是DoMeasuring中的锁,要么是Measure中的锁),尽管这取决于缺少的位。

票数 3
EN

Stack Overflow用户

发布于 2011-05-04 12:33:59

如果您的instrument由多个devices使用,最佳实践是在您的instrument类中设置lock。因此,第一个解决方案效果更好。

但最好是创建一个新的锁对象,并在instrument类中使用它。

代码语言:javascript
运行
复制
public class Instrument
{
  Object lockKey = new Object();
  public double Measure() 
  { 
    lock(lockKey)
    {
      return 0; 
    }
  }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5878520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档