我有一个测量仪器对象:
public class Instrument
{
public double Measure()
{
return 0;
}
}我有一个设备需要做一些测量:
public class Device
{
public Instrument MeasuringInstrument { get; set; }
public void DoMeasuring()
{
var result = this.MeasuringInstrument.Measure();
}
}测量仪器一次只能在一个设备上操作,但许多设备可以使用同一仪器。我对线程是个新手,据我所知,以下两种解决方案都有一些注意事项。
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。有什么建议吗?
非常感谢,
肯
发布于 2011-05-04 12:33:00
通常的模式是创建您自己的私有object,以便在明显的选择可能暴露在类之外的情况下进行锁定,例如:
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中的锁),尽管这取决于缺少的位。
发布于 2011-05-04 12:33:59
如果您的instrument由多个devices使用,最佳实践是在您的instrument类中设置lock。因此,第一个解决方案效果更好。
但最好是创建一个新的锁对象,并在instrument类中使用它。
public class Instrument
{
Object lockKey = new Object();
public double Measure()
{
lock(lockKey)
{
return 0;
}
}
}https://stackoverflow.com/questions/5878520
复制相似问题