【问题标题】:Inter-Process Synchronization with Barrier带屏障的进程间同步
【发布时间】:2013-12-15 02:08:33
【问题描述】:

我有一个 Java 程序,它可以并行执行一些计算。我可以在一台机器上运行它,也可以使用多台不同的机器。

在单机上执行时,使用 java.util.concurrent.CyclicBarrier 包中的 CyclicBarrier 类成功实现线程同步。这个想法是所有线程必须等待其他线程到达同一点才能继续计算。

在多台不同机器上执行时,进程间通信是通过 RMI(远程方法调用)实现的。在这种情况下我有同样的问题,我希望这些进程的线程在继续之前等待其他进程到达同一点。我不能在不同进程之间使用共享的 CyclicBarrier 对象,因为此类不可序列化。

在多台机器上的不同进程上执行的线程上获得这种屏障行为的替代方法是什么?

谢谢

【问题讨论】:

  • 您可以设置一个环境,使此操作看起来不那么复杂。即,这里是a sample implementation for Hazelcast,它使用分布式AtomicNumber 来计算到达方。
  • 即使它是可序列化的,它仍然不会被共享。对其进行序列化会在目标上创建一个新副本,而不是共享对象。

标签: java multithreading parallel-processing rmi interprocess


【解决方案1】:

您不需要在进程之间传递 CyclicBarrier。您可以进行 RMI 调用,该调用又使用 CyclicBarrier。我建议你看看 HazelCast,它支持分布式 Lock 和许多其他集合。

恕我直言,我会重新考虑您是否真的需要所有流程来检查点并找到一种方法来避免首先需要这个。

【讨论】:

  • 使用 CyclicBarrier 的 RMI 调用似乎是个好主意!我也在寻找异步技术来解决这个问题(并避免这个进程同步问题)。 HazelCast 似乎也很棒。我不确定我是否能够使用它,因为我在第三方集群上运行这个实验,而且我对机器没有太多控制权。感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 2021-12-02
  • 2011-08-06
  • 2016-06-22
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 2013-08-31
  • 2017-10-19
相关资源
最近更新 更多