Using volatile instead of synchronized for a simulation
volatile should perform better and is appropriate in this situation. A volatile read/write is almost as fast as a non volatile read/write on modern architectures. On the other hand, locking with synchronized will have an overhead, especially in a highly contented scenario (many threads fighting for the lock).

Note however that unless you call the pause/run methods thousands or millions of times per second, you will probably not notice the difference.

Additional comments

This line:

this.simulations = Collections.unmodifiableList(simulations);


probably does not do what you think it does: this.simulations is unmodifiable, but the calling code can still modify the original collection, and the changes will be reflected to your local version (or they won't depending on memory consistency). It would probably be better to do a defensive copy:

this.simulations = new ArrayList&lt;&gt; (simulations);


Another note: because your simulations is effectively immutable,

this.simulations = new ArrayList&lt;&gt; ();


could be replaced by:

this.simulations = Collections.emptyList();


And by the way, you could make simulations final.