应该公开在API中等待锁定

时间:2012-08-30 11:52:24

标签: java api locking

我提供了一个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();
        }

此致 Goutham

2 个答案:

答案 0 :(得分:3)

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

从一般的角度来看,我只能说你所展示的代码类型绝对不是默认/显而易见的方式,并且只有在情况明确表明这种方法确实是必要的时候才会被要求

答案 1 :(得分:1)

根据你要提供的API,你可以选择它,对我来说有另外一种选择

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

  • 如果你只是试图获得锁定并且如果你不能那么扔掉。 好处:用户可以自行决定重试/超时策略。

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

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