这段代码是线程安全的吗?

maf*_*afu 1 c# locking thread-safety

我有一个有几个属性的课程.在每次更新值时,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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个设计是线程安全的吗?

(顺便说一下,如果你能想到一个更合适的标题,可以随意编辑.)

我认为它是线程安全的.如果在多个线程上更改了属性,则值将按随机顺序设置,原子存储将以随机顺序发生,但最终,每个属性都将具有其最新值,并且最后会发生原子存储,确保文件是最新的.

澄清:属性不会经常设置,但可以同时设置.重要的是大部分时间都有一个有效的文件.

如果线程要根据属性值更改属性,则必须锁定整个对象以与其他线程同步.这与锁定on List枚举基本相同,并不是此类的责任.

SLa*_*aks 5

这取决于你在不同线程上调用的内容.

如果同时在不同的线程上设置属性,则它不是线程安全的,因为属性可以在序列化时更改.