我正在尝试编写一个线程安全的方法,它只能被调用一次(每个对象实例)。如果之前已经调用过,应该抛出异常。
我想出了两个解决方案。他们都正确吗?如果不是,他们有什么问题?
与
lock
:public void Foo() { lock (fooLock) { if (fooCalled) throw new InvalidOperationException(); fooCalled = true; } … } private object fooLock = new object(); private bool fooCalled;
-
public void Foo() { if (Interlocked.CompareExchange(ref fooCalled, 1, 0) == 1) throw new InvalidOperationException(); … } private int fooCalled;
如果我没记错的话,这个解决方案的优点是无锁(这在我的情况下似乎无关紧要),并且它需要更少的私有字段。
我也愿意接受合理的意见,应该首选哪种解决方案,如果有更好的方法,我也会提出进一步的建议。