4

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

我知道这听起来令人困惑,但基本上我不想与这个 C# 片段等效,而是在 Java 中。

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

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

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

4

4 回答 4

13

相当于:

synchronized (this)
{
}

(不,您通常不应该在 C# 或 Java 中执行此操作。更喜欢锁定没有其他人可以访问的私有引用。当然,您可能已经意识到这一点 - 但我不想留下答案没有警告:)

于 2009-01-13T15:19:38.107 回答
6

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

synchronized (this)
{
// ...
}

这是Java并发教程 以获取更多信息

于 2009-01-13T15:21:34.937 回答
1

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

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

像这样:

public class PrivateLock {
    private final Object myLock = new Object();
    @GuardedBy("myLock") Widget widget;

    void someMethod() {
        synchronized (myLock) {
            // Access or modify the state of widget
        }
    }
}
于 2009-01-13T15:38:26.337 回答
1

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

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

于 2009-01-13T15:44:44.967 回答