14

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

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

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

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

4

5 回答 5

14

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

解决方案

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

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

解决方案:

  • 提供分布式锁定

  • 也是

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

于 2012-05-16T16:32:31.520 回答
1

我正在使用Redisson提供的分布式锁来同步不同 JVM 的工作

于 2016-08-27T08:29:48.297 回答
0

它们都是线程级的?

这是正确的,synchronized等只在单个进程的上下文中工作。

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

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

于 2012-05-16T16:31:32.897 回答
0

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

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

于 2016-08-23T00:43:20.473 回答