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

标签 c# thread-safety locking

我有一个具有多个属性的类。在每次值更新时,都会调用一个 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/

相关文章:

c# - 为什么我的 Windows 服务会在大约 5 秒后自动退出?

c# - JsonConvert.Deserializer 索引问题

locking - Apache Zookeeper/Curator 锁的生存时间

sql-server-2005 - SQL Server 2005/2008 上的默认表锁定提示

java - 可以根据条件重新启动的线程

winapi - 锁定文件但允许当前进程使用?

c# - 跨域Cors问题

c# - 如何在 ASP.NET Core 中定义和使用不同的用户类型

java - Java中PrintStream的线程安全

multithreading - 线程,QRunnable 和 QThreadPool,我无法详细介绍