Sie versuchen, sich vor dem Wiedereintritt von demselben Thread oder mehreren Threads zu schützen, die gleichzeitig zugreifen.
Unter der Annahme eines Multi-Thread-Zugriffs ist der Lichtansatz java.util.concurrent.atomic
zu verwenden. Keine Notwendigkeit für etwas, das so schwer ist wie ein Schloss (vorausgesetzt, es gibt keine weiteren Anforderungen).
no-Reentry aus der gleichen Methode Unter der Annahme:
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!
}
}
}
Wenn Sie Reentry im selben Thread zulassen wollen, dann wird es chaotisch genug Schlösser zu verwenden:
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.
}
}
}
könnte die Verwendung Execute Around Idiom dafür.
Das ist gut. So wird es normalerweise gemacht. –
Versuchen Sie, das Problem zu lösen, dass mehrere Threads dieselbe Methode auf einmal ausführen, oder das Problem der Methode (vielleicht indirekt) sich selbst nennt? –
@Anon die Methode, die sich indirekt aufruft. –