我正在将此类作为单例实现。我不擅长线程安全。想要确保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。另外,不要使用单例。