由两个线程同时访问的单例类(引用类型)上的方法是否安全?

时间:2019-03-01 17:08:06

标签: c# thread-safety

希望您能帮助我弄清对线程安全性的了解,并帮助您了解Singleton上的方法。

我在下面概述了一个简单的情况。我的问题是:如果ProcessorOne和ProcessorTwo同时运行,并且DatabaseIntegration类是引用类型并且是单例(由CastleWindsor管理),并且ProcessorOne和ProcessorTwo共享此DataBaseIntegration的单例实例,那么是否有潜力由ProcessorOne保存的实体名称是否来自ProcessorTwo?

意味着通过ProcessorOne线程对方法进行调用后,ProcessorTwo所运行的线程是否可以修改ProcessorOne传递给EntityIntegration.Save(实体实体)的Entity参数?

public class ProcessorOne
{
    private readonly DatabaseIntegration databaseIntegration;
    public ProcessorOne(DatabaseIntegration databaseIntegration)
    {
        this.databaseIntegration = databaseIntegration;
    }

    public void Process()
    {                                  
       Entity entity = new Entity() 
       {
           Name="NameOne"
       };

       this.dataBaseIntegration.Save(entity);
    }
}

public class ProcessorTwo
{
    private readonly DatabaseIntegration dataBaseIntegration;
    public ProcessorTwo(DatabaseIntegration dataBaseIntegration)
    {
        this.dataBaseIntegration = dataBaseIntegration;
    }

    public void Process()
    {            
       Entity entity = new Entity() 
       {
           Name="NameTwo"
       };

       this.dataBaseIntegration.Save(entity);
    }
}

public class DatabaseIntegration 
{     
    public void Save(Entity entity)
    {            
         using (DbContext context = new DbContext(sqlConnection))
         {
             context.Entity.Add(entity);
             context.SaveChanges();                 
         }
    }
}

1 个答案:

答案 0 :(得分:1)

否。

尽管ProcessorOneProcessorTwo都共享对DatabaseIntegration的相同引用,并且它们都可以同时运行DatabaseIntegration.Save方法,{{1} }方法是线程安全的。

构造两个共享相同连接的DatabaseIntegration.Save并同时使用它们是安全的-它们不会互相干扰。您的数据库会确保确保两个插入不会互相干扰。

如果您的DbContexts方法执行了一些不是线程安全的操作,例如您在DatabaseIntegration.Save上有一个由DatabaseIntegration修改的字段位于锁外,则您可能会引入线程安全问题。