我将这个类实现为单例.我不擅长线程安全.想要确保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)
它不是.后增量操作不是原子操作.您需要进行以下更改:
用以下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仍然有效.看到这个问题.
另外,不要使用单身人士.