Use synchronized(this) for size etc (no need for a read/write lock here), check for size in pushAll loop without having to lock again.