Used CopyOnWriteArrayList for specifications and aggregateSpecs to avoid
possibility of error if specs are modified while under iteration from
another thread.