首页 > 解决方案 > 多线程场景中 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()可以正常工作,没有重复。

标签: c#.netmultithreadingguid

解决方案


您并没有完全重复,但您的代码似乎在生成 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);
    }
 }

推荐阅读