这个类线程安全吗?

Beh*_*joo 1 c# multithreading

我将这个类实现为单例.我不擅长线程安全.想要确保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++);
    }

}
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 8

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

用以下GenerateOrderID方法替换方法:

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

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

请注意,Interlocked.Increment它比使用lock同步线程更有效,但lock仍然有效.看到这个问题.

另外,不要使用单身人士.