C# 动作委托和多线程同步
我有现场公共行动更新;可以由多个线程调用。此外,此字段可以更改为null等。我是否应该创建一个属性并在其中使用lock语句?或者当我设置更新=新操作时。。。它是一个原子操作,不需要锁?在C中设置引用是一个原子操作,因此不需要锁。但是,您应该使更新引用具有易变性,以确保在发生更改时在所有线程中正确刷新更新引用:C# 动作委托和多线程同步,c#,synchronization,C#,Synchronization,我有现场公共行动更新;可以由多个线程调用。此外,此字段可以更改为null等。我是否应该创建一个属性并在其中使用lock语句?或者当我设置更新=新操作时。。。它是一个原子操作,不需要锁?在C中设置引用是一个原子操作,因此不需要锁。但是,您应该使更新引用具有易变性,以确保在发生更改时在所有线程中正确刷新更新引用: public volatile Action Update; 不管线程是什么,最好的做法是不直接公开成员,而是使用属性。然后,您需要使属性的备份存储不稳定,这就排除了自动属性: priv
public volatile Action Update;
不管线程是什么,最好的做法是不直接公开成员,而是使用属性。然后,您需要使属性的备份存储不稳定,这就排除了自动属性:
private volatile Action update;
public Action Update
{
get { return update; }
set { update = value; }
}
遵循Anders的答案,但是如果执行空检查以避免竞争条件,则需要将变量的值临时存储在局部变量中 坏例子:
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();
}
好例子:
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();
}
谢谢,我觉得我需要这样的东西:-在调用代理之前检查null时,请注意可能的竞争条件。