C#线程安全快速(est)计数器
在C#中获得线程安全计数器的最佳方式是什么?
这是如此简单:
public static long GetNextValue() { long result; lock (LOCK) { result = COUNTER++; } return result; }
但有更快的select吗?
这会更简单:
return Interlocked.Increment(ref COUNTER);
MSDN Interlocked.Increment
根据其他人的build议, Interlocked.Increment
将比lock()
有更好的性能。 只要看看IL和Assembly,你会发现Increment
变成了“总线locking”语句,其variables直接增加(x86)或者“增加”到(x64)。
这个“总线locking”语句locking总线,以防止另一个CPU在主叫CPU执行操作时访问总线。 现在,看看C# lock()
语句的IL。 在这里,您将看到对Monitor
调用,以便开始或结束一个部分。
换句话说,.net lock()
语句比.Net Interlocked.Increment
做的要多得多。
所以,如果你想要做的是增加一个variables, Interlock.Increment
会更快。 查看所有联锁方法以查看各种可用的primefaces操作并find适合您需要的操作。 当你想做更复杂的事情,比如多个相关的增量/减量,或者序列化比整数更复杂的资源时,使用lock()
。
我build议你在System.Threading库中使用.NET内置的互锁增量。
下面的代码将通过引用来增加一个长variables,并且是完全线程安全的:
Interlocked.Increment(ref myNum);
资料来源: http : //msdn.microsoft.com/en-us/library/dd78zt0c.aspx
尝试与Interlocked.Increment