我有一个具有多个属性的类。在每次值更新时,都会调用一个 Store
方法来存储所有字段(在一个文件中)。
private int _Prop1;
public int Prop1 {
get {
return _Prop1;
}
set {
_Prop1 = value;
Store();
}
}
// more similar properties here...
private XmlSerializer _Ser = new ...;
private void Store()
{
lock (_Ser) {
using (FileStream fs = new ...) {
_Ser.Serialize (fs, this);
}
}
}
这个设计是线程安全的吗?
(顺便说一句,如果您能想到更合适的标题,请随意编辑。)
我认为它是线程安全的。如果在多个线程上更改属性,值将以随机顺序设置,原子存储将以随机顺序发生,但最后,每个属性都会有其最新值,并且在最后,发生原子存储,确保文件是最新的。
说明:属性不会经常设置,但可以同时设置。重要的是在大多数情况下拥有有效的文件。
如果线程要更改与属性值相关的属性,它必须锁定整个对象以与其他线程同步。这与在枚举上锁定 List
基本相同,并且不是此类的责任。
最佳答案
这取决于您在不同线程上调用的内容。
如果您同时在不同的线程上设置属性,则它不是线程安全的,因为属性在序列化时可能会发生变化。
关于c# - 这段代码是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2574993/