我有一个应用程序,每隔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是可序列化的,因此应在整个群集中均可使用。
去吧。