@Override public final void start() throws Exception { Lock lock = Locks.write(readWriteLock); ensure(State.NEW, State.STOPPED); try { logTransition("Starting"); doStart(); current = State.STARTED; logTransition("Started"); } catch (Throwable failure) { doFailed("start", failure); } finally { lock.unlock(); } }