c# - 多线程场景中 Guid.NewGuid() 的重复值
问题描述
class Program
{
private static string RequestID;
static void Main(string[] args)
{
for (int i = 0; i < 1000; i++)
{
Thread t1 = new Thread(logs);
Thread t2 = new Thread(logs);
Thread t3 = new Thread(logs);
t1.Start();
t2.Start();
t3.Start();
}
Console.ReadLine();
}
public static void logs()
{
RequestID = Guid.NewGuid().ToString();
Console.WriteLine(RequestID);
}
}
根据我的分析,这是因为RequestID
字段是static
,但我想GuId
在静态方法中使用它。重复的 id 是随机的,即,如果我在没有线程或少量迭代的情况下运行相同的代码,则Guid.NewGuid()
可以正常工作,没有重复。
解决方案
您并没有完全重复,但您的代码似乎在生成 GUID 并将其写入控制台之间存在竞争条件。
此行在RequestID = Guid.NewGuid().ToString();
运行之前可能在两个不同的线程Console.WriteLine(RequestID);
中运行,导致控制台输出最新的 GUID 两次(或更多),从而看起来是重复的。
我建议您锁定生成和打印,以免发生竞争情况
private static readonly Object obj = new Object();
public static void logs()
{
lock(obj){
RequestID = Guid.NewGuid().ToString();
Console.WriteLine(RequestID);
}
}
推荐阅读
- flutter - Flutter FutureBuilder 变化的反映
- python - 如何反序列化没有名称的对象数组?
- java - 如何在android中创建一个主题实例
- flutter - Flutter:查找年、月(包括闰年)中两个日期之间的差异
- javascript - 蚂蚁设计。在事件上更改 twoToneColor
- python - python IDLE 3.8.4不保存文件
- java - 搜索手机身份验证firebase问题
- html - 提供带有 base24 数据 URL 的浏览器选项卡图标
- struct - 在 Rust 中传递对结构的引用
- windows-terminal - 控制台之间的 Windows 终端颜色方案不一致