同じスレッドまたは同時にアクセスしている複数のスレッドからの再入力を防止しようとしていますか?
マルチスレッドアクセスを仮定すると、軽いアプローチはjava.util.concurrent.atomic
を使用することです。ロックとして「重い」ものは必要ありません(これ以上の要件はありません)。あなたは同じスレッド内で再入国を許可したい場合は、それはロックを使用するのに十分な乱雑取得
private final AtomicBoolean inMethod = new AtomicBoolean();
void method1() {
if (inMethod.compareAndSet(true, false)) { // Alternatively getAndSet
try {
// do Stuff
} finally {
inMethod.set(false); // Need to cover exception case!
}
}
}
:
private final AtomicReference<Thread> inMethod = new AtomicReference<Thread>();
void method1() {
final Thread current = Thread.currentThread();
final Thread old = inMethod.get();
if (
old == current || // We already have it.
inMethod.compareAndSet(null, current) // Acquired it.
) {
try {
// do Stuff
} finally {
inMethod.set(old); // Could optimise for no change.
}
}
}
を使用することができ、同様の方法から無再突入を想定していない
このためにイディオムを実行します。
これは良いことです。それは通常どのように行われているのです。 –
同じメソッドを同時に実行する複数のスレッドの問題を解決しようとしていますか、あるいはメソッドの問題(おそらくは間接的に)自身を呼び出すのでしょうか? –
@間接的に自分自身を呼び出すメソッドではありません。 –