0

我提供了一个 api 来做一些 crud 操作,它又使用现有的内部实现,我另外实现的是一个锁机制,如果它无法在某些情况下获取,它肯定会等待/重试应用程序级锁来执行这些操作重试,它会抛出一个带有错误文本的自定义异常。在代码审查期间,我被告知不应该等待,而应该由 api 的用户来处理。

我应该从实现中删除这个等待的锁吗?

        lockManager = new LockManager();
        aquiredLock = lockManager.aquireLock();
        final int numberOfRetries = 3;
        final int sleepTime = 1000;
        int retryAttempt = 0;
        while (!aquiredLock.isLockAquired() && retryAttempt < numberOfRetries) {
            retryAttempt++;
            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
                throw new CannotAcquireLockException(e.getMessage(), e);
            }
            aquiredLock = lockManager.aquireLock();
        }

问候, 古瑟姆

4

2 回答 2

3

这种事情一般是不能决定的。您的代码审查员可能对您的问题领域了解很多,因此他们的建议很可能是合理的。

从一般的角度来看,我只能说您显示的那种代码绝对不是默认/显而易见的方式,并且只有在从环境中明确这种方法确实有必要时才会被调用。

于 2012-08-30T11:56:15.913 回答
1

它是你的选择,取决于你想提供什么 API,对我来说有这个选择

  • 您将锁定等待机制留在您的方法中。好处:对用户来说更容易,因为它不必关心这个锁定问题。缺点:API 用户无法自行超时或重试。

  • 如果您只是尝试获取锁并在无法获得的情况下抛出。好处:用户可以自行决定重试/超时策略。

在这两种情况下,您都必须在 API 中记录您的选择。在审查过程中重要的是,它可以告诉您该选择是否与 API 的其他部分(有关相同锁的其他方法)一致,以及是否真的需要该锁。

旁注:在我们的应用程序(数据库引擎)中,我们提供了获取/释放锁的 API,并在 API 调用中测试确实持有锁。

于 2012-08-30T12:00:04.847 回答