我曾经有幸尝试在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()函数而不是使用私有锁?
由于