我正在进行的项目会触发各种异步作业来完成一些工作。当我深入研究时,这些异步作业实际上是作为单独的 JVM(单独的 Java 进程)运行的。这是否意味着如果我需要在这些进程之间进行同步,我将无法使用以下任何内容:
- 同步方法/块
- 任何实现的锁
java.util.concurrent.locks
因为在我看来它们都是线程级的?
Java 是否提供对 IPC 的支持,例如进程之间的信号量?
我正在进行的项目会触发各种异步作业来完成一些工作。当我深入研究时,这些异步作业实际上是作为单独的 JVM(单独的 Java 进程)运行的。这是否意味着如果我需要在这些进程之间进行同步,我将无法使用以下任何内容:
java.util.concurrent.locks
因为在我看来它们都是线程级的?
Java 是否提供对 IPC 的支持,例如进程之间的信号量?
这是正确的。您不能使用任何标准同步机制,因为它们在一个 JVM 中工作。
解决方案
您可以使用synchronized
关键字、锁、原子对象等 - 但它们是 JVM 本地的。因此,如果您有两个 JVM 运行相同的程序,它们仍然可以例如同时运行相同的synchronized
方法 - 每个 JVM 一个,但不能更多。
解决方案:
terracotta提供分布式锁定
榛树也是
您可以在文件系统或数据库上使用手动同步
它们都是线程级的?
这是正确的,synchronized
等只在单个进程的上下文中工作。
Java 是否提供对 IPC 的支持,例如进程之间的信号量?
在 Java 进程之间实现通信的一种方法是使用RMI。
我已经使用文件实现了一个 java IPC Lock 实现:FileBasedLock和一个使用共享数据库(jdbc)的 IPC Semaphore 实现:JdbcSemaphore。这两种实现都是spf4j的一部分。
如果您有 Zookeeper 实例,请查看Apache Curator的基于 Zookeeper 的 Lock 配方