2

我在形成这个问题时遇到了麻烦,所以我会尝试用几种方式来说明它,这样就不会重复通常关于静态方法的讨论。这可能更像是一个架构问题。

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

4

2 回答 2

3

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

thread传入p参数中的数据A不会被 thread 访问B。当然,假设这两个线程将引用传递给完全不同的对象实例。

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

于 2013-03-26T19:34:13.793 回答
0

如果您对可变数据结构进行多线程、不同步的写入,那么损坏总是有可能的。静态成员在这方面并不特殊。如果你想锁定对它们的访问,你必须明确地这样做。

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

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

    // etc...
}

注意:如果您不进行多线程访问,那么由于只使用一个线程,一切都会以串行方式运行。

于 2013-03-26T19:34:00.347 回答