2013-11-28 44 views
1

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

在单台机器上执行时,通过使用java.util.concurrent.CyclicBarrier包中的CyclicBarrier类可以成功实现线程同步。这个想法是所有线程都必须等待其他线程在进行计算之前到达同一个点。

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

对于在多台机器上的不同进程上执行的线程获取此屏障行为,我有什么替代方法?

谢谢

+1

您可以设置此操作看起来不那么复杂的环境。即,这里是[Hazelcast的示例实现](https://code.google.com/p/hazelcast/issues/detail?id=435),它使用分布式的“AtomicNumber”来计算到达的各方。 –

+1

即使它是可序列化的,它仍然不会被共享。对它进行序列化会在目标上创建新副本,而不是共享对象。 – EJP

回答

3

您不需要在进程之间传递CyclicBarrier。你可以做一个RMI调用,然后使用一个CyclicBarrier。我建议你看看HazelCast,它支持分布式Lock和许多其他收藏。

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

+0

使用CyclicBarrier的RMI调用似乎是个好主意!我还在寻找异步技术来解决这个问题(并避免这个过程同步问题)。 HazelCast似乎也很棒。我不确定我是否能够使用它,因为我在第三方群集上运行此实验,并且我没有太多的控制权。感谢您的提示。 –