【问题标题】:Java synchronization between different JVMs不同JVM之间的Java同步
【发布时间】:2012-05-16 16:27:21
【问题描述】:

我正在进行的项目会触发各种异步作业来完成一些工作。当我深入研究时,这些异步作业实际上是作为单独的 JVM(单独的 Java 进程)运行的。这是否意味着如果我需要在这些进程之间进行同步,我将无法使用以下任何一项:

  • 同步方法/块
  • 任何实现java.util.concurrent.locks的锁

因为在我看来它们都是线程级的?

Java 是否支持 IPC,例如进程间的信号量?

【问题讨论】:

    标签: java synchronization process


    【解决方案1】:

    没错。您不能使用任何标准同步机制,因为它们在一个 JVM 中工作。

    解决方案

    1. 您可以使用 java 7 中引入的文件锁。
    2. 您可以通过数据库实体使用同步。
    3. Terracota 等已实施的解决方案可能会有所帮助
    4. 重新思考您的设计。如果您是 Java 世界的初学者,请尝试与更有经验的工程师详细交谈。您的问题表明恕我直言,您只是走错了路。

    【讨论】:

    • 谢谢!我们正在重新使用来自不同项目的相同架构,因此某些设计在我们的世界中可能没有意义。非常感谢您的意见,这非常有帮助。
    • 5.您可以使用 Java 1.4 中引入的文件锁。
    【解决方案2】:

    您可以使用synchronized 关键字、锁、原子对象等 - 但它们是 JVM 本地的。因此,如果您有两个 JVM 运行相同的程序,它们仍然可以,例如同时运行相同的 synchronized 方法 - 每个 JVM 一个,但不会更多。

    解决方案:

    • 提供分布式锁定

    • 也一样

    • 您可以在文件系统或数据库上使用手动同步

    【讨论】:

      【解决方案3】:

      我正在使用Redisson提供的distributed lock来同步不同JVM的工作

      【讨论】:

        【解决方案4】:

        它们都是线程级的?

        没错,synchronized 等只能在单个进程的上下文中工作。

        Java 是否支持 IPC,例如进程间的信号量?

        实现 Java 进程之间通信的一种方法是使用RMI

        【讨论】:

          【解决方案5】:

          我已经使用文件实现了一个 java IPC Lock 实现:FileBasedLock 和一个使用共享 DB (jdbc) 的 IPC Semaphore 实现:JdbcSemaphore。这两种实现都是spf4j 的一部分。

          如果您有 zookeeper 实例,请查看 Apache Curator 中基于 Zookeeper 的 Lock 配方

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-04
            • 2018-06-28
            • 1970-01-01
            • 2014-01-29
            • 2013-02-13
            相关资源
            最近更新 更多