我有一个C#函数,可以从多个线程多次调用,但我希望它只执行一次,所以我想到了这个:
class MyClass
{
bool done = false;
public void DoSomething()
{
lock(this)
if(!done)
{
done = true;
_DoSomething();
}
}
}
问题在于_DoSomething
需要很长时间,我不希望许多线程等待它,而这些线程可以看到done
为真。
可以使用类似以下代码的解决方法:
class MyClass
{
bool done = false;
public void DoSomething()
{
bool doIt = false;
lock(this)
if(!done)
doIt = done = true;
if(doIt)
_DoSomething();
}
}
但仅手动执行锁定和解锁将会更好。
我应该如何手动执行锁定和解锁,就像使用 lock(object)
一样? 我需要使用与 lock
相同的接口进行操作,以便这种手动方式和 lock
会互相阻塞(对于更复杂的情况)。
lock(this)
的缺点:为什么lock(this)
是不好的? - Cody Gray