首页 > 解决方案 > C# 静态扩展线程安全吗?

问题描述

我正在使用静态扩展将字符串转换为 Sha256,如下所示:

    public static string ToSha256(this string value)
    {
        var message = Encoding.ASCII.GetBytes(value);
        SHA256Managed hashString = new SHA256Managed();
        string hex = "";

        var hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hex += String.Format("{0:x2}", x);
        }
        return hex;
    }

注意 static 关键字。当两个线程同时进入并修改函数中的任何内部变量时会发生什么,结果会受到影响吗?

谢谢

标签: c#multithreadingthread-safety

解决方案


在考虑代码是否线程安全时,静态没有任何影响。静态仅意味着该方法及其数据不会在所有类实例中复制。您必须尝试想象如果第二个线程在第一个线程仍然忙碌时进入您的代码会发生什么。在您忙于处理局部变量时,问问自己这些数据会发生什么变化。

假设线程 1 将进入您的方法,它在示例的第 3 行将字符串 hex 的值设置为空。然后它进入 for 循环。当线程 1 仍在 for 循环中时,线程 2 进入并将十六进制字符串值设置回空。不好先生!

此代码不是线程安全的。您应该简单地对一些私有静态对象使用 lock 关键字。

此处示例: https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement


推荐阅读