静态属性作为该类的实例的线程安全考虑

Ari*_*ian 1 c# asp.net concurrency thread-safety c#-6.0

请考虑这段代码:

public class BusinessClass
{
    static BusinessClass myClass { get; set; }
    Repository repo;

    public BusinessClass()
    {
        if (repo == null)
            repo = new RepositoryClass();
    }

    public static BusinessClass Instance
    {
        get
        {
            if (myClass == null)
                myClass = new BusinessClass();
            return myClass ;
        }
    }

    public void Update(Entity Item)
    {
        repo.Update(Item);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想BL在我的网页中使用它,如下所示:

BusinessClass.Instance.Update(Item);
Run Code Online (Sandbox Code Playgroud)

我的问题是:这段代码对于线程安全有问题吗?方法上两个人可以同时走到一起吗Update

谢谢

Ari*_*tos 5

第一种情况——asp.net会话锁

如果您使用asp.net表单和asp.net会话,那么会话将锁定所有用户的整个调用,因此您不需要额外注意同步它。

相关问题:

ASP.NET Web 窗体是否阻止双击提交?
尝试使 Web 方法异步
Web 应用程序在处理共享同一会话的另一个 Web 应用程序时被
阻止 哪些性能计数器可用于识别 ASP.NET 瓶颈?
完全替换 ASP.Net 的会话

第二种情况——本地线程。

如果您不使用asp.net会话,或者如果您在同一个调用上打开额外的线程,那么您需要锁定静态数据的操作。

public class BusinessClass
{
    private static readonly object oLock = new object();

    static BusinessClass myClass { get; set; } = null;
    Repository repo;

    public BusinessClass()
    {
        if (repo == null)
            repo = new RepositoryClass();
    }

    public static BusinessClass Instance
    {
        get
        {
            if myClass == null)
            {
                lock (oLock)
                {
                    if myClass == null)
                        myClass = new BusinessClass();
                }
            }
            return myClass  
        }
    }

    public void Update(Entity Item)
    {
        repo.Update(Item);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一个案例——全球变化

如果您希望仔细检查数据库或文件上的全局更改,或者任何可以通过系统模拟编辑更改的内容 - 在网络花园(同一站点的多个池)上运行的网络平台上......并忽略会话...

然后你需要互斥锁来同步所有调用。

通过使用mutex,您还需要在更新之前检查记录是否仍然相同,如果不是,则发出信号表明其他人更改了它,当前用户将覆盖它。

更多需要考虑 - 多用户环境。

想想这个场景。
用户A和B加载相同的页面、相同的数据,并且每个人都改变它们。

用户将保存每个数据——不是同一时刻——而是有很多不同的时间。您写下的数据是最后保存的数据。其中一位用户将丢失他们的更改。

因此,如果您的用户更新相同的数据(超出锁定系统),您需要更多考虑并在多用户环境中发出更多同步信号。