可以接受变量的静态成员是否会损坏?

时间:2013-03-26 19:29:33

标签: c# multithreading static thread-safety

我在编写这个问题时遇到了麻烦,因此我将尝试用几种方式说明这一点,这样就不会重复关于静态方法的常规讨论。这可能更像是一个架构问题。

如果静态类上有静态成员接受传入的变量,那么如果操作使用率很高且长时间运行,是否存在数据冲突/损坏的风险? 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的第一篇文章 - 特别感谢所有花时间发布问题/答案的人 - 感谢您的时间!

2 个答案:

答案 0 :(得分:3)

如果两个不同的线程同时调用Person.Insert,它们将同时执行。除非方法中有一些明确的阻塞。

线程p无法访问线程AB参数中传递的数据。当然,假设这两个线程传递了对完全不同的对象实例的引用。

只要Insert方法中的任何内容都不能访问外部范围内的任何内容,调用就是完全安全的。例如,所有方法局部变量对于两个线程将是不同的。只有当您开始遇到问题时,方法(或它调用的方法)才开始访问外部作用域的数据。

答案 1 :(得分:0)

如果您对可变数据结构进行多线程,不同步写入,则始终存在损坏。静态成员在这方面并不特别。如果要锁定对它们的访问权限,则必须明确这样做。

public static class Person {
    private readonly object syncLock = new object();

    public static void Insert(Person p) {
        lock(syncLock) {
            //...
        }
    }

    // etc...
}

注意:如果你没有进行多线程访问,那么一切都将以串行方式运行,因为只使用一个线程。