diff --git a/src/main/java/org/apache/commons/pool3/impl/GenericObjectPool.java b/src/main/java/org/apache/commons/pool3/impl/GenericObjectPool.java index 96b3c96b8..dcf2c83e1 100644 --- a/src/main/java/org/apache/commons/pool3/impl/GenericObjectPool.java +++ b/src/main/java/org/apache/commons/pool3/impl/GenericObjectPool.java @@ -1092,16 +1092,19 @@ public void returnObject(final T obj) { } } else { - synchronized (p) { - if(p.getState() != PooledObjectState.INVALID) { - if (getLifo()) { - idleObjects.addFirst(p); - } else { - idleObjects.addLast(p); - } - } + if (!p.deallocate()) { + throw new IllegalStateException( + "Object has already been returned to this pool or is invalid"); } + if (getLifo()) { + idleObjects.addFirst(p); + } else { + idleObjects.addLast(p); + } + + + if (isClosed()) { // Pool closed while object was being added to idle objects. // Make sure the returned object is destroyed rather than left