所以这是我用于双重检查锁定的自定义实用程序:它是一种静态方法,您可以将标准、同步对象和要执行的操作输入其中。
public static bool RunIf(Func<bool> criterion, object syncObject, Action action)
{
if (criterion())
lock(syncObject)
if (criterion())
{
Thread.MemoryBarrier();
action();
return true;
}
return false;
}
我了解到,根据 C# 规范,优化器可以重新排序内存分配,在没有内存屏障的情况下,这种技术可以给出误报并在不应该执行操作时执行操作。
在我的小世界里,如果这样的失败是可能的,那么也应该可以设计一个测试,通过使用足够数量的并行测试用例对场景进行足够猛烈的冲击,从而始终如一地证明失败。我一直在寻找这样的测试大约一年了,但到目前为止我还是一片空白。谁能给我看一个测试:
显示此方法在没有内存屏障的情况下失败;
在恢复内存屏障的情况下重复测试时显示其成功?