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

标签 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();
        }

    }

}

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

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

最佳答案

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

去吧。

关于java - 如何锁定java方法以保护多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429101/

相关文章:

java - 有什么方法可以找到出现以下索引错误的原因吗?

java - 在工作线程中阻塞 Java Swing 用户的模式

csv - 同时写入多个 csv 文件,在 Golang 中的分区列上拆分

android - 处理程序发布的 Runnable 看到错误的对象状态(竞争条件?)

java - Java获取域名的相关部分

java - 多个应用程序之间共享事务

java - 在 Java 中使用静态变量或方法作为常量数组

java - GWT 射频 : How to share the same code in client and server

java - 如何处理 Java 事件队列

multithreading - 为什么这个程序在分配的线程越少时运行得越快?