Javaでメソッドがその親オブジェクトをロックできるようにする
-
22-07-2019 - |
質問
Javaには、それが含まれているオブジェクトをロック(mutex)するメソッドを取得する方法がありますか?
これは紛らわしいように聞こえますが、基本的にこのC#のスニペットと同等ではなく、Javaを使用します。
lock(this)
{
// Some code here...
}
.Netで記述されたAPIをJavaに再実装する作業を担当し、Javaバージョンを.Netバージョンと人間に可能な限り似た状態に保つように依頼されました。これは、.Netバージョンが、アクセスできないC ++バージョンから転写されたように見えたという事実によっては助けられません。
とにかく、C#バージョンでは上記の行が表示されますが、Javaでも同じことが必要です。
解決
それに相当するのは:
synchronized (this)
{
}
(いいえ、通常はC#またはJavaで行うべきではありません。他に何もアクセスできないプライベート参照をロックすることをお勧めします。もちろん、既に知っているかもしれませんが、私はしたくありませんでした。警告なしで答えを残してください:)
他のヒント
C ++コードが単純なミューテックスであると仮定して、「ロック」を置き換えます。 " synchronized"
synchronized (this)
{
// ...
}
詳細については、 Java並行性チュートリアルをご覧ください
>Brian Goetzの" Java並行性の実践をお勧めします。"素晴らしい本です。
同期ブロックをできるだけ小さく保つことは良いことです。メソッドで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