公共getLock()或getMutex()函数是反模式吗?

时间:2016-09-23 01:29:33

标签: java c++ concurrency synchronization anti-patterns

我曾经有幸尝试在C ++代码库中发现可能的并发问题,我不断看到这样的模式:

lock(obj.getLock());
obj.foo();
unlock(obj.getLock());

或更糟:

public void bar(SomeObject obj)
{
   obj.foo;
}

lock(obj.getLock());
bar(obj);
unlock(obj.getLock());

因此,我必须查看调用foo()的每个地方并跟踪,直到我可以验证它只能从锁定的上下文中访问。 (从技术上讲,没有明确的解锁,因为这些都是范围锁,但你明白了。)

我想不出你为什么会这样做的任何理由而不是让SomeObj对象负责它自己的锁定,只要这样调用foo就通过私有锁:

public void foo()
{
   lock(myPrivateLock);
   whateverFooDoes();
   unlock(myPrivateLock);
}

通过这种方式,我可以在不必追踪任何内容的情况下达成相同的保证。即使您需要同时对多个类执行原子操作,您仍然可以创建一个控制其自身锁的实用程序来执行此操作。不幸的是,我还没有能够找到解释何时使用公共getLock()的任何来源,也没有任何其他人将其称为反模式。

有没有时间你应该/必须提供一个公共的getLock()函数而不是使用私有锁?

由于

0 个答案:

没有答案