我在编写这个问题时遇到了麻烦,因此我将尝试用几种方式说明这一点,这样就不会重复关于静态方法的常规讨论。这可能更像是一个架构问题。
如果静态类上有静态成员接受传入的变量,那么如果操作使用率很高且长时间运行,是否存在数据冲突/损坏的风险? IE:数据访问类,接受对象图类型以持久存储到数据库中。
例如:
namespace MyApp.DAL.People
{
public static class Person
{
public static void Insert(Entities.People.Person p)
{
// ADO.net code, try catch etc, execute to db, call other private method
....
Helper(p);
}
private static void Helper(Entities.People.Person p)
{
// do work...
}
}
}
如果用户“A”启动Person.Insert(myNewPerson)
调用操作,则在用户“B”使用静态类和方法将其“人物对象”保存到数据库之前,该过程完全完成。
操作是串行还是异步,基本上阻止使用静态类?
如果应用程序(开发人员)试图在应用程序空间中使用多个线程,这只是一个问题吗?
除非你明确地为应用程序启动另一个线程,否则一切都在单个线程上运行?
作为旁注,这是我关于SO的第一篇文章 - 特别感谢所有花时间发布问题/答案的人 - 感谢您的时间!
答案 0 :(得分:3)
如果两个不同的线程同时调用Person.Insert
,它们将同时执行。除非方法中有一些明确的阻塞。
线程p
无法访问线程A
在B
参数中传递的数据。当然,假设这两个线程传递了对完全不同的对象实例的引用。
只要Insert
方法中的任何内容都不能访问外部范围内的任何内容,调用就是完全安全的。例如,所有方法局部变量对于两个线程将是不同的。只有当您开始遇到问题时,方法(或它调用的方法)才开始访问外部作用域的数据。
答案 1 :(得分:0)
如果您对可变数据结构进行多线程,不同步写入,则始终存在损坏。静态成员在这方面并不特别。如果要锁定对它们的访问权限,则必须明确这样做。
public static class Person {
private readonly object syncLock = new object();
public static void Insert(Person p) {
lock(syncLock) {
//...
}
}
// etc...
}
注意:如果你没有进行多线程访问,那么一切都将以串行方式运行,因为只使用一个线程。