簡體   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