From cae55812574e9253a0c701e5d1d9b829cfd15230 Mon Sep 17 00:00:00 2001 From: Abhijith V Mohan Date: Wed, 15 May 2024 07:58:27 +0530 Subject: [PATCH] ResourcePool get release semaphore only on exception --- .../leonardoz/patterns/resource_pool/ResourcePool.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/br/com/leonardoz/patterns/resource_pool/ResourcePool.java b/src/main/java/br/com/leonardoz/patterns/resource_pool/ResourcePool.java index db7df92..e08c14f 100644 --- a/src/main/java/br/com/leonardoz/patterns/resource_pool/ResourcePool.java +++ b/src/main/java/br/com/leonardoz/patterns/resource_pool/ResourcePool.java @@ -22,8 +22,8 @@ public class ResourcePool { private final static TimeUnit TIME_UNIT = TimeUnit.SECONDS; - private Semaphore semaphore; - private BlockingQueue resources; + private final Semaphore semaphore; + private final BlockingQueue resources; public ResourcePool(int poolSize, List initializedResources) { this.semaphore = new Semaphore(poolSize, true); @@ -39,9 +39,13 @@ public T get(long secondsToTimeout) throws InterruptedException { semaphore.acquire(); try { T resource = resources.poll(secondsToTimeout, TIME_UNIT); + if (resource == null) { + semaphore.release(); + } return resource; - } finally { + } catch (Exception e) { semaphore.release(); + throw e; } }