我提供了一个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
答案 0 :(得分:3)
这种事情一般不能决定。您的代码审核人员可能对您的问题域了解很多,因此他们的建议可能是合理的。
从一般的角度来看,我只能说你所展示的代码类型绝对不是默认/显而易见的方式,并且只有在情况明确表明这种方法确实是必要的时候才会被要求
答案 1 :(得分:1)
根据你要提供的API,你可以选择它,对我来说有另外一种选择
您在方法中保留锁定等待机制。 好处:对用户来说更容易,因为它不必关心此锁定问题。 缺点:API用户无法执行超时或自行重试。
如果你只是试图获得锁定并且如果你不能那么扔掉。 好处:用户可以自行决定重试/超时策略。
在这两种情况下,您都必须在API中记录您的选择。在审核过程中重要的是,它可以告诉您这个选择是否与API的其他部分一致(关于相同锁的其他方法),以及是否真的需要此锁。
旁注:在我们的应用程序(数据库引擎)中,我们提供了API来获取/释放锁定确实持有的API调用中的锁和测试。