希望您能帮助我弄清对线程安全性的了解,并帮助您了解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();
}
}
}
答案 0 :(得分:1)
否。
尽管ProcessorOne
和ProcessorTwo
都共享对DatabaseIntegration
的相同引用,并且它们都可以同时运行DatabaseIntegration.Save
方法,{{1} }方法是线程安全的。
构造两个共享相同连接的DatabaseIntegration.Save
并同时使用它们是安全的-它们不会互相干扰。您的数据库会确保确保两个插入不会互相干扰。
如果您的DbContexts
方法执行了一些不是线程安全的操作,例如您在DatabaseIntegration.Save
上有一个由DatabaseIntegration
修改的字段位于锁外,则您可能会引入线程安全问题。