我正在将此类作为单例实现。我不擅长线程安全。想要确保GenerateOrderID类是线程安全的。更具体地说,orderCount变量不能由不同的对象同时增加,并且无法进行计数。

public class OrderIDGenerator

{

    private static readonly OrderIDGenerator instance = new OrderIDGenerator();
    private int orderCount;


    private OrderIDGenerator()
    {
        orderCount = 1;
    }


    public static OrderIDGenerator Instance
    {
        get { return instance; }
    }

    public string GenerateOrderID()
    {
        return String.Format("{0:yyyyMMddHHmmss}{1}", DateTime.Now, orderCount++);
    }

}

最佳答案

它不是。后增量操作不是原子的。您将需要进行以下更改:

将此替换为GenerateOrderID方法:

public string GenerateOrderID()
{
    return String.Format("{0:yyyyMMddHHmmss}{1}",
                         DateTime.Now,
                         Interlocked.Increment(ref orderCount));
}

并将orderCount初始化为0而不是1,因为Interlocked.Increment返回增加的值。 (换句话说,Interlocked.Increment(ref foo)在所有方面都与++foo相同,除了它是原子的,因此是线程安全的。)

请注意,尽管Interlocked.Increment仍然可以工作,但lock比使用lock同步线程要高效得多。参见this question

另外,不要使用单例。

10-06 06:39