When start() or shutdown(), service's state is not thread safe which may break happen-before.
1. If the user is start twice in two thread, the resources may initize twice.
2. if the user start in threadA and shutdown very quicky in another thread B, shutdown may not reclaim the resources.
Though the sceniro is very uncommon, but it is indeed a bug here. Fix is actually quite trivial.