繁体   English   中英

此代码是线程安全的吗? 如何使其成为线程安全的?

[英]Is this code thread-safe? How can I make it thread-safe?

我有一个带有安全类的WCF服务,用于获取调用用户的某些属性。 但是,在线程安全性方面我非常糟糕-到目前为止,我不需要做太多事情,只需要对多线程问题有基本的理论理解即可。

赋予以下功能:

public class SecurityService
{
    public static Guid GetCurrentUserID()
    {
        if (Thread.CurrentPrincipal is MyCustomPrincipal)
        {
            MyCustomIdentity identity = null;
            MyCustomPrincipal principal = (MyCustomPrincipal)Thread.CurrentPrincipal;
            if (principal != null)
            {
                identity = (MyCustomIdentity)principal.Identity;
            }

            if (identity != null)
            {
                return identity.UUID;
            }
        }
        return Guid.Empty;
    }
}

如果同时从两个不同的线程中调用该方法,是否有可能在其中出错? 在我的噩梦中,如果这些方法出错,我会看到可怕的后果,例如有人意外获取他人数据或突然成为系统管理员。 一位同事(他也不是专家,但他比我强。)认为这可能还可以,因为实际上并没有访问任何共享资源。

还是这个将访问数据库的数据库-会出错吗?

    public static User GetCurrentUser()
    {
        var uuid = GetCurrentUserID();
        if (uuid != null)
        {
            var rUser = new UserRepository();
            return rUser.GetByID(uuid);
        }
        return null;
    }

关于线程的原理有很多讨论,但是当涉及到实际应用以及何时应用的时候,我倾向于陷入混乱。 任何帮助表示赞赏。

如果不清楚,我可以解释更多有关这些功能的上下文/用途的信息。

编辑: rUser.GetByID()函数基本上调用到使用NHibernate查找数据库的存储库。 因此,我猜这里的数据库是“共享资源”,但实际上并不是为此操作而被锁定或修改的数据库...在这种情况下,我认为还可以...?

从我看来,第一个示例仅访问线程本地存储和基于堆栈的变量,而第二个示例仅访问基于堆栈的变量。

两者都应该是线程安全的。

我不知道GetByID是否是线程安全的。 查看它是否访问任何共享/静态资源。 如果这样做的话,没有一些额外的代码来保护那些资源就不是线程安全的。

上面的代码不包含任何更改全局状态的代码,因此可以确定,由多个同时线程调用不会有问题。 安全主体信息与每个线程相关,因此那里也没有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM