The remove(R) method should be such that if the resource that is being removed is currently in use, the remove operation will  block until that resource has been released.
forbid addition of acquired resource
forbid resources acquiring when close() is called
Add a new method, void closeNow(), which closes the pool immediately without waiting for all acquired resources to be released.
Add a new method, boolean removeNow(R resource) that removes the given resource immediately without waiting for it to be released. It returns true if the call resulted in the pool being modified and false otherwise.
use hash map for acquired objects
fixing case when several threads are waiting for different objects to be released
added "happy-path" stress test
cleanup
get rid of 3rd party libs
avoid adding resources twice