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