@xetorthio @marcosnils 
I have been dug some more time about this.
Since GenericObjectPool is very complicated to maintain thread-safe, I completely gave up adding more synchronizing state.
(ReentrantReadWriteLock wasn't a solution - DEADLOCK occurred with heavily tested)

Instead, I made a different approach.
1. Let getObject() request fail when pool is re-initializing
2. catch exception
3. wait pool to available and retry

Because of implementation, performance is not decreased or little.
I have made some tests, and all tests are success.

I have also modified returnObject() & returnBrokenObject() to ignore Exception when element is not maintained current pool. (I think it's mostly previous pool, so it's OK.)

Please see 8a26a117bb0f086c1b201b65614f85f05d0efedf and comment!
If you agree to merge, I'll make PR to new branch.

Thx!