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

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

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

lock(this) { // Some code here... } 

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

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

相当于:

 synchronized (this) { } 

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

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

 synchronized (this) { // ... } 

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

我推荐Brian Goetz的“ Java Concurrency In Practice” 。 这是一本很好的书。

保持同步块尽可能小是一件好事。 在方法上使用synchronized修饰符是粗粒度的,有时是必要的,但是否则你可以使用另一个对象来保持块更小。

喜欢这个:

 public class PrivateLock { private final Object myLock = new Object(); @GuardedBy("myLock") Widget widget; void someMethod() { synchronized (myLock) { // Access or modify the state of widget } } } 

您还应该查看API(JDK 5.0+)的java.util.concurrent包以获取其他并发管理对象,例如信号量,交换机等。

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html