2009-08-11 121 views
5

我有一个安全类的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; 
    } 
} 

是否有任何机会的东西可以去错在那里,如果该方法被调用在2级不同的线程在同一时间?在我的恶梦中,如果这些方法出错,我会看到可怕的后果,比如有人不小心收到别人的数据或突然成为系统管理员。一位同事(他也不是专家,但他比我好)认为这可能会好起来,因为没有任何共享资源正在被访问。

或者这个会访问数据库 - 这可能会出错吗?

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

有很多关于线程的校长讨论,但我倾向于掉下来会感到困惑,当涉及到实际应用它,知道什么时候使用它。任何帮助赞赏。

如果不清楚,我可以更多地解释这些函数的上下文/目的。

编辑: rUser.GetByID()函数基本上调用一个存储库,使用NHibernate查找数据库。所以我猜这里的数据库是一个“共享资源”,但并不是真的被锁定或修改为这个操作...在这种情况下,我想这没关系......?

+0

谢谢,Erics。我现在感到更放心了。 – Gavin 2009-08-11 07:52:28

回答

12

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

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

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

+0

我将您的话作为事实,并将安全漏洞的所有责任放在我的应用程序中。 :) – Gavin 2009-08-11 07:51:57

+0

将它带上:-D 你应该很好,假设GetByID也是线程安全的。 – 2009-08-11 08:26:31

3

您上面的代码不包含任何代码更改全局状态,因此您可以相当确定它不会被多个同时调用的线程调用的问题。安全主要信息绑定到每个线程,所以在那里也没有问题。