我有public Action Update;
可以被多个线程调用的字段。此字段也可以更改为 null 等。我应该创建一个属性并在其中使用锁定语句吗?或者当我将Update = new Action (...)
它设置为原子操作并且它不需要锁时?
问问题
534 次
2 回答
4
按照安德斯的回答,但是如果您进行空检查以避免竞争条件,则需要将变量的值临时存储在局部变量中。
不好的例子:
if(myClass.Update != null)
{
// Race condition if Update is set to null here by another thread
myClass.Update();
}
好例子:
var updateMethod = myClass.Update;
if(updateMethod != null)
{
// No race condition since we try to call
// the same value that we checked for null
updateMethod();
}
于 2013-01-10T22:07:50.523 回答
3
在 C# 中设置引用是原子操作,因此不需要锁。但是,您应该使Update
引用 volatile 以确保在更改时它在所有线程中正确刷新:
public volatile Action Update;
不管线程如何,最好不要直接公开成员,而是使用属性。然后,您需要使属性 volatile 的后备存储,这排除了自动属性:
private volatile Action update;
public Action Update
{
get { return update; }
set { update = value; }
}
于 2013-01-10T12:06:07.270 回答