@xetorthio One more approach is trying ReentrantReadWriteLock with read lock (get / return) and write lock (change pool).
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html
Since write lock would be occurred when only master has changed, we can minimize running overhead for sync.