不同JVM之间的Java同步
我正在研究的项目会触发各种异步工作来完成一些工作。 在我看来,这些异步作业实际上是作为单独的JVM(单独的Java进程)运行。 这是否意味着如果我需要在这些进程之间进行同步,我将无法使用以下任何一项:
- 同步方法/块
- 任何实现
java.util.concurrent.locks
锁
因为在我看来他们都是线程级的?
Java是否像流程之间的信号量一样为IPC提供支持?
那就对了。 您不能使用任何标准同步机制,因为它们在一个JVM中工作。
解决方案
- 您可以使用java 7中引入的文件锁。
- 您可以通过数据库实体使用同步。
- 像Terracota这样已经实施的解决方案之一可能会有所帮助
- 重新考虑你的设计。 如果您是Java世界的初学者,请尝试与经验丰富的工程师进行详细交谈。 你的问题表明恕我直言,你只是在错误的方式。
您可以使用synchronized
关键字,锁,primefaces对象等 – 但它们是JVM的本地关键字。 因此,如果您有两个运行相同程序的JVM,它们仍然可以例如同时运行相同的synchronized
方法 – 每个JVM上一个,但不是更多。
解决方案:
-
兵马俑提供分布式锁定
-
也是如此
-
您可以在文件系统或数据库上使用手动同步
他们都是线程级别的?
这是正确的, synchronized
等只能在单个进程的上下文中工作。
Java是否像流程之间的信号量一样为IPC提供支持?
在Java进程之间实现通信的一种方法是使用RMI 。
我已经使用文件实现了一个java IPC Lock实现: FileBasedLock和一个使用共享DB(jdbc)的DB2 Semaphore实现: JdbcSemaphore 。 这两个实现都是spf4j的一部分。
如果您有一个zookeeper实例,请查看Apache Curator中基于Zookeeper的Lock配方
我正在使用Redisson提供的分布式锁来同步不同JVM的工作