2009-08-11 117 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

您上面的代碼不包含任何代碼更改全局狀態,因此您可以相當確定它不會被多個同時調用的線程調用的問題。安全主要信息綁定到每個線程,所以在那裏也沒有問題。