我有一個安全類的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