Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有公共getLock()或getMutex()函数是反模式吗? 我曾经很高兴在C++代码库中找出可能并发的问题,在那里我一直看到这样的模式: lock(obj.getLock()); obj.foo(); unlock(obj.getLock());_Java_C++_Concurrency_Synchronization_Anti Patterns - Fatal编程技术网

Java 具有公共getLock()或getMutex()函数是反模式吗? 我曾经很高兴在C++代码库中找出可能并发的问题,在那里我一直看到这样的模式: lock(obj.getLock()); obj.foo(); unlock(obj.getLock());

Java 具有公共getLock()或getMutex()函数是反模式吗? 我曾经很高兴在C++代码库中找出可能并发的问题,在那里我一直看到这样的模式: lock(obj.getLock()); obj.foo(); unlock(obj.getLock());,java,c++,concurrency,synchronization,anti-patterns,Java,C++,Concurrency,Synchronization,Anti Patterns,或者更糟: public void bar(SomeObject obj) { obj.foo; } lock(obj.getLock()); bar(obj); unlock(obj.getLock()); 因此,我必须查看调用foo()的每个地方并进行跟踪,直到我能够验证它是否只能从锁定的上下文访问。(从技术上讲,没有明确的解锁,因为这些都是作用域锁,但您知道这一点) 我想不出有什么理由可以这样做,而不是让SomeObj对象通过私有锁负责自己的锁定,无论何时调用foo都是这样: p

或者更糟:

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()函数而不是使用私有锁


谢谢

我特别好奇C++和/或java中的答案,但是我想答案应该不会在面向对象语言之间变化很大。你的怀疑是正确的,几乎肯定是差的风格。但是,如果要在同一事务中更新多个对象,则需要将获取锁与操作分开(请参阅)。在我的经验中,这是一个罕见的用例。。。有趣。如果我正确理解了这个示例,我认为我的解决方案很可能是将assign\u sunch\u partner()函数同步到它自己的锁上,而不是让它需要获取单个员工锁,但是我想这会阻止一些非冲突调用同时执行。我想如果我们假设有大量员工,并且由于某种原因分配午餐伙伴是一个缓慢而复杂的操作,那么同步该方法可能会导致严重的性能损失。