@Override public <Result> Result modify(IUnitOfWork<Result, State> work) { acquireWriteLock(); State state = null; Result exec = null; try { state = getState(); beforeModify(state, work); exec = work.exec(state); return exec; } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new WrappedException(e); } finally { releaseWriteLock(); try { acquireReadLock(); afterModify(state, exec, work); } finally { releaseReadLock(); } } }
public <T> T modify(IUnitOfWork<T, P> work) { acquireWriteLock(); P state = null; T exec = null; try { state = getState(); beforeModify(state, work); exec = work.exec(state); return exec; } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new WrappedException(e); } finally { releaseWriteLock(); try { acquireReadLock(); afterModify(state, exec, work); } finally { releaseReadLock(); } } }