@ryanlecompte good call, I can add synchronization.  The SparkEnv setup is all single-threaded today but it doesn't hurt to future proof.

However, I'm thinking maybe we don't even need a ConfigUpdater.  Instead each component can just store updates in its own instance, as readable variables, and SparkEnv can then add up config changes, like:

    val httpBroadcast = new BroadCast.....
    val broadcastUpdate = Map("spark.broadcast.port" -> httpBroadcast.boundPort)

    val mergedConfig = origConfig ++ broadcastUpdate ++ ....

What do you think?