我有一个应用程序,每 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 是可序列化的,因此应该在您的集群中工作。
去吧。
关于java - 如何锁定java方法以保护多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429101/