Java 如果API中的锁被公开,则将其锁定

Java 如果API中的锁被公开,则将其锁定,java,api,locking,Java,Api,Locking,我提供了一个api来执行一些crud操作,inturn使用了一个现有的内部实现,我还实现了一个锁机制,它会等待/重试应用程序级锁来执行这些操作,如果在某些重试中无法获取,它会抛出一个带有错误文本的自定义异常。在代码审查期间,我被告知不应该进行这种等待,而应该由api的用户来处理 我是否应该从实现中删除此等待的锁 lockManager = new LockManager(); aquiredLock = lockManager.aquireLock();

我提供了一个api来执行一些crud操作,inturn使用了一个现有的内部实现,我还实现了一个锁机制,它会等待/重试应用程序级锁来执行这些操作,如果在某些重试中无法获取,它会抛出一个带有错误文本的自定义异常。在代码审查期间,我被告知不应该进行这种等待,而应该由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();
        }
lockManager=新的lockManager();
aquiredLock=lockManager.aquirellock();
最终整数重试次数=3;
最终int睡眠时间=1000;
int retrytry=0;
而(!aquiredLock.isLockAquired()&&retrytry
问候,,
古瑟姆

这种事情不能笼统地决定。您的代码审阅者可能对您的问题域了解很多,因此他们的建议可能是合理的


从一般的角度来看,我只能说,您所展示的代码类型肯定不是默认/明显的方式,只有在情况清楚表明这种方法确实是必要的时候才会被调用。

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


从一般的角度来看,我只能说,您所展示的代码类型肯定不是默认/明显的方式,只有当从实际情况来看,这种方法确实是必要的时才会被调用。

这是您的选择,取决于您要提供的API,对我来说,有这个选择

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

  • 如果你只是想得到锁,如果你做不到就扔优点:用户可以自行决定重试/超时策略

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


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

这是您的选择,取决于您要提供什么样的API,对于我来说,有这个选择

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

  • 如果你只是想得到锁,如果你做不到就扔优点:用户可以自行决定重试/超时策略

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


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

可能的话,您可以尝试在不等待的情况下运行程序吗。也许它不是必需的。如果这是一个标准的GUI应用程序,人们通常不应该在主GUI线程中等待(锁定、网络活动或其他)任何“长时间”,因为这会“锁定”GUI并导致非常糟糕的“人机界面”行为(有时可能导致操作系统终止应用程序)。不过,一般来说,等待一小段时间——不到一秒钟——是可以的。在您的代码中,您可能需要等待3秒钟,这有点长。@PeterLawrey锁定是必要的,因为多个应用程序可以使用此api。@HotLicks它不是从GUI应用程序调用的,它是从后端应用程序调用的,以动态生成一些对象来映射已有的对象,关于锁定时间,我同意你的看法,可能应该是一个可配置的参数(如果LockManager是用户定义的类,它应该包含一个tryLock类型的方法,将上述逻辑封装到一个整洁的调用中。)可能的话,你能试着在不等待的情况下运行你的程序吗。也许它不是必需的。如果这是一个标准的GUI应用程序,人们通常不应该在主GUI线程中等待(锁定、网络活动或其他)任何“长时间”,因为这会“锁定”GUI并导致非常糟糕的“人机界面”行为(有时可能导致操作系统终止应用程序)。不过,一般来说,等待一小段时间——不到一秒钟——是可以的。在您的代码中,您可能需要等待3秒钟,这有点长。@PeterLawrey锁定是必要的,因为多个应用程序可以使用此api。@HotLicks它不是从GUI应用程序调用的,它是从后端应用程序调用的,以动态生成一些对象来映射已有的对象,关于锁定时间,我同意您的看法,这可能是一个可配置的参数(如果LockManager是由用户定义的类,那么它应该包含一个tryLock类型的方法,该方法将上述逻辑封装到单个tidy调用中。)