Adding synchronization here puts the load of synchronization at this level instead of delegating it to the implementations being called.  It's intended to be up to the delegated implementations on if/how synchronization is handled.