$ java SemaphoreResourceGuard worker-0 round 1: acquired permit, 1 callers concurrently in the resource (availablePermits=0) worker-1 round 1: acquired permit, 2 callers concurrently in the resource (availablePermits=0) worker-2 round 1: acquired permit, 2 callers concurrently in the resource (availablePermits=0) worker-3 round 1: acquired permit, 2 callers concurrently in the resource (availablePermits=0) worker-3 round 2: acquired permit, 1 callers concurrently in the resource (availablePermits=1) worker-0 round 2: acquired permit, 2 callers concurrently in the resource (availablePermits=0) worker-1 round 2: acquired permit, 1 callers concurrently in the resource (availablePermits=1) worker-2 round 2: acquired permit, 2 callers concurrently in the resource (availablePermits=0) worker-2 round 3: acquired permit, 1 callers concurrently in the resource (availablePermits=1) worker-3 round 3: acquired permit, 2 callers concurrently in the resource (availablePermits=0) worker-0 round 3: acquired permit, 1 callers concurrently in the resource (availablePermits=1) worker-1 round 3: acquired permit, 2 callers concurrently in the resource (availablePermits=0) permits=2 maxObservedConcurrency=2 done