[SPARK-4949] [SPARK-4949] shutdownCallback in SparkDeploySchedulerBackend should be enclosed by synchronized block.

A variable `shutdownCallback` in SparkDeploySchedulerBackend can be accessed from multiple threads so it should be enclosed by synchronized block.
This doesn't work since `shutdownCallbackLock` may be `null`.