不同JVM之间的Java同步

不同JVM之间的Java同步,java,synchronization,process,terracotta,hazelcast,Java,Synchronization,Process,Terracotta,Hazelcast,我正在从事的项目将触发各种异步作业来做一些工作。随着我深入了解,这些异步作业实际上是作为单独的JVM(单独的java进程)运行的。这是否意味着如果我需要在这些进程之间进行同步,我将无法使用以下任何一项: 同步方法/块 实现java.util.concurrent.locks 因为在我看来它们都是线程级别的 Java是否支持进程之间类似IPC的信号量?没错。您不能使用任何标准的同步机制,因为它们工作在一个JVM中 解决方案 您可以使用Java7中引入的文件锁 您可以通过数据库实体使用同步 像T

我正在从事的项目将触发各种异步作业来做一些工作。随着我深入了解,这些异步作业实际上是作为单独的JVM(单独的java进程)运行的。这是否意味着如果我需要在这些进程之间进行同步,我将无法使用以下任何一项:

  • 同步方法/块
  • 实现
    java.util.concurrent.locks
因为在我看来它们都是线程级别的


Java是否支持进程之间类似IPC的信号量?

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

解决方案

  • 您可以使用Java7中引入的文件锁
  • 您可以通过数据库实体使用同步
  • 像Terracota这样已经实施的解决方案之一可能会有所帮助
  • 重新思考你的设计。如果您是java世界的初学者,请尝试与更有经验的工程师详细交谈。你的问题表明你走错了方向 它们都是线程级别的

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

    Java是否支持进程之间类似IPC的信号量


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

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

    解决方案:

    • 提供分布式锁定

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


    我使用文件实现了一个java IPC锁实现:使用共享数据库(jdbc)实现了一个IPC信号量实现。这两种实现都是应用程序的一部分


    如果您有zookeeper实例,请查看我使用提供的基于zookeeper的锁配方来同步不同JVM的工作,谢谢!我们正在使用来自不同项目的相同体系结构,因此一些设计在我们的世界中可能没有意义。非常感谢你的投入,这是非常有帮助的。您可以使用Java1.4中引入的文件锁。