diff --git a/src/main/java/io/axoniq/axonserver/connector/impl/SynchronizedRequestStream.java b/src/main/java/io/axoniq/axonserver/connector/impl/SynchronizedRequestStream.java index ee5d115e..9c6f1801 100644 --- a/src/main/java/io/axoniq/axonserver/connector/impl/SynchronizedRequestStream.java +++ b/src/main/java/io/axoniq/axonserver/connector/impl/SynchronizedRequestStream.java @@ -19,7 +19,6 @@ import io.grpc.stub.ClientCallStreamObserver; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.ReentrantLock; /** * Lock-based synchronized implementation of a {@link ClientCallStreamObserver}. Acts as a wrapper of another {@code @@ -31,7 +30,7 @@ public class SynchronizedRequestStream extends ClientCallStreamObserver { private final ClientCallStreamObserver delegate; - private final ReentrantLock lock = new ReentrantLock(); + private final AtomicBoolean lock = new AtomicBoolean(false); private final AtomicBoolean halfClosed = new AtomicBoolean(false); /** @@ -101,13 +100,15 @@ public void onCompleted() { } private void inLock(Runnable action) { + while (!lock.compareAndSet(false, true)) { + Thread.yield(); + } try { - lock.lock(); if (!halfClosed.get()) { action.run(); } } finally { - lock.unlock(); + lock.set(false); } } }