public <T> T runWriteAction(@NotNull final Computable<T> computation) {
   final AccessToken token = acquireWriteActionLock(computation.getClass());
   try {
     return computation.compute();
   } finally {
     token.finish();
   }
 }
  public <T> T runReadAction(@NotNull final Computable<T> computation) {
    final AccessToken token = acquireReadActionLockImpl(false);

    try {
      return computation.compute();
    } finally {
      token.finish();
    }
  }