允许方法在Java中锁定其父对象

Oma*_*eji 4 c# java cross-language code-translation

在Java中有没有办法获得一个方法来锁定(互斥)它所在的对象?

我知道这听起来令人困惑,但基本上我对C#的这个片段并不公平,但在Java中.

lock(this)
{
    // Some code here...
}
Run Code Online (Sandbox Code Playgroud)

我的任务是将用.Net编写的API重新实现到Java中,并且我被要求保持Java版本尽可能与.Net版本类似.事实上,.Net版本看起来像是从我无法访问的C++版本转录而来的.

无论如何,上面的行出现在C#版本中,我需要在Java中做同样的事情.

Jon*_*eet 12

相当于:

synchronized (this)
{
}
Run Code Online (Sandbox Code Playgroud)

(不,你通常不应该在C#或Java中这样做.更喜欢锁定没有其他任何东西可以访问的私人引用.当然你可能已经知道了 - 但我不想留下答案没有警告:)

  • 如果你*希望*暴露锁定,那么这是一回事 - 但是否则,锁定其他人可能锁定的东西有什么好处?没有必要创建一个新对象,这是微不足道的好处 - 但基本上就是这样.另请参阅Jeff Richter通过C#的CLR的P636-639. (3认同)
  • 因为那时其他代码无法锁定你.这就像揭露更多的方法 - 但更难调试,因为线程从根本上来说很难. (2认同)

kdg*_*ory 6

假设C++代码是一个简单的互斥锁,将"lock"替换为"synchronized"

synchronized (this)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)

以下是Java Concurrency教程 以获取更多信息