我有一个安全类的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查找数据库。所以我猜这里的数据库是一个“共享资源”,但并不是真的被锁定或修改为这个操作...在这种情况下,我想这没关系......?
谢谢,Erics。我现在感到更放心了。 – Gavin 2009-08-11 07:52:28