c# - 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 关键字。当两个线程同时进入并修改函数中的任何内部变量时会发生什么,结果会受到影响吗?
谢谢
解决方案
在考虑代码是否线程安全时,静态没有任何影响。静态仅意味着该方法及其数据不会在所有类实例中复制。您必须尝试想象如果第二个线程在第一个线程仍然忙碌时进入您的代码会发生什么。在您忙于处理局部变量时,问问自己这些数据会发生什么变化。
假设线程 1 将进入您的方法,它在示例的第 3 行将字符串 hex 的值设置为空。然后它进入 for 循环。当线程 1 仍在 for 循环中时,线程 2 进入并将十六进制字符串值设置回空。不好先生!
此代码不是线程安全的。您应该简单地对一些私有静态对象使用 lock 关键字。
此处示例: https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement
推荐阅读
- sql - 使用连接后如何连接具有不同 WHERE 条件的表
- symfony - Symfony 3.4 - 在我的模式中传递变量?
- jenkins - 在 Jenkins Pipeline 上生成 JUnit 报告时出现问题
- c - 如何修复保存矩阵到链表
- django - Django 在发出 POST 请求时在表单集中有多个表单时抛出错误
- git - Git保持相同的提交但恢复文件
- javascript - 是否有一个 loadash 函数来比较两个数组并仅当 arr2 中的所有值都存在于 arr1 时才返回 true?
- swift - 为什么我必须放弃 Swift 类的协议一致性以进行数组扩展?
- node.js - 无法获取特定路线
- ios - Apple 商店要求 {mediaType: 'photo'} 中的音频权限