我有一个关键部分,它只执行一次,但被许多场景调用。如何执行此线程过程并跳过所有其余调用?
提前致谢。
// Assuming this uses calls from multiple threads, I used volatile.
volatile bool executed = false;
object lockExcecuted = new object();
void DoSomething()
{
lock (lockExecuted)
{
if (executed) return;
executed = true;
}
// do something
}
public static bool hasExecuted = false;
static readonly object lockObject = new object();
static void Method()
{
lock(lockObject)
{
if(!hasExecuted)
{
// run code
hasExecuted = true;
}
}
}
锁定是首选方法;除非你有更详细的要求。
编辑:添加“仅一次”意味着锁定不足。
用于lock
仅允许一个线程访问关键部分,并在完成时设置一个标志,表示已完成。
取决于你的场景。如果此部分返回一个值,您可以使用 .Net 4.0 的新功能 - Lazy(T)
当然,您总是可以在您的关键部分中设置一个标志,并在执行之前检查它的值(这有时在使用单例模式时完成)