如何锁定java方法以保护多个调用

Ric*_*mon 9 java concurrency

我有一个应用程序,每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();
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

ReplicatorRunner是类拥有该方法replicate只能运行一次一个.

编辑.如果方法已在任何实例上运行,我需要下一次调用失败(不阻止).

Mat*_*ynn 4

这看起来不错。ReentrantLock.tryLock() 只会将锁授予一个线程,因此synchronized不是必需的。它还可以防止您所说的同步中固有的阻塞。ReentrantLock 是可序列化的,因此应该可以跨集群工作。

大胆试试吧。