我有一个目前不需要线程安全的类,但将来我们可能想制作一个线程安全的版本。在我看来,我现在可以通过在相关函数周围加锁来使其成为线程安全的,或者我现在可以使它们成为虚拟的,然后在后代类的重写中将它们加锁。也就是说,今天我可以这样做:
public void DoStuff()
{
lock (this.SyncRoot)
{
// Do stuff...
}
}
或者我可以这样做:
public virtual void DoStuff()
{
// Do stuff...
}
今天,哪个选项可以更快地完成工作?
请您参考如下方法:
虚函数调用基本上是一个数组查找加上一个间接函数调用。如果虚调用发生在一个循环中,即如果虚函数调用在同一个实例的同一个地方被多次调用,那么在大多数迭代中,它不会比非内联的普通函数调用慢。现代 CPU 分支预测器预测虚函数调用的目标,并在获取函数地址的同时推测性地执行该目标。
另一方面,锁在幕后总是涉及至少一两个原子操作。此类操作几乎肯定会对 CPU 管道造成严重破坏,因为它们需要内存屏障。
