如何以线程安全的方式生成连续的唯一标识符

7

我调用了多个线程以生成一个数字,但我希望使用所有线程来生成一个唯一的号码(例如,一个线程生成一个编号ABC1,而第二个线程必须生成ABC2,以此类推)。


如果您能提供一个 [mcve] 就太棒了。 - jazb
请问,您只是想以线程安全的方式递增计数器吗? - Evan Trimboli
2个回答

9

您可以使用Interlocked.Increment,这将在计数器上完成线程安全的增量。

public class Person
{
    private static int _counter;

    public string GetNewId()
    {
        int id = Interlocked.Increment(ref _counter);
        return $"ABC{id}";
    }
}

1
我赞同你的答案。Interlocked.Increment 相对于实现 lock 来说速度较快。 - Gerald Chifanzwa

0
如果您只想要一种线程安全的方法来生成唯一的数字,那么您可以像这样做:
private static object _lock = new object();
private static int mIdx = 0;
public static string GenerateNumber()
{
     lock (_lock)
     {
          return $"ABC{mIdx++}";
     }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接