我有一个应用程序,每隔15分钟左右从远程数据库进行一次复制。它只是使两个存储库保持同步。复制完成后,将无法再次执行此操作。我已经设置了以下结构,但是我不确定这是否是正确的方法。

public class ReplicatorRunner {

       private static Lock lock = new ReentrantLock();

       public replicate() {

           if (lock.tryLock()) {
               try {
                   // long running process
               } catch (Exception e) {
               } finally {
                   lock.unlock();
               }
           } else {
               throw new IllegalStateException("already replicating");
           }

       }

}

public class ReplicatorRunnerInvocator {

    public void someMethod() {

        try {
            ReplicatorRunner replicator = new ReplicatorRunner();
            replicator.replicate();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }

    }

}
ReplicatorRunner是拥有replicate方法的类,该方法只能一次运行一次。

编辑。
如果该方法已经在任何实例上运行,则我需要下一个调用失败(而不是阻止)。

最佳答案

看起来不错ReentrantLock.tryLock()仅将锁授予一个线程,因此不需要synchronized。它还可以防止您所说的同步固有的阻塞。 ReentrantLock是可序列化的,因此应在整个群集中均可使用。

去吧。

10-04 12:29