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 Concurrency チュートリアル を参照してください。

于 2009-01-13T15:21:34.937 に答える
1

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
        }
    }
}
于 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 に答える