Межпроцессная синхронизация с барьером

У меня есть программа на Java, которая выполняет некоторые вычисления параллельно. Я могу запустить его на одной машине или на нескольких разных машинах.

При выполнении на одном компьютере синхронизация потоков успешно достигается с помощью класса CyclicBarrier из пакета java.util.concurrent.CyclicBarrier. Идея состоит в том, что все потоки должны ждать, пока другие потоки прибудут в ту же точку, прежде чем продолжить вычисления.

При выполнении на нескольких разных машинах межпроцессное взаимодействие реализуется через RMI (удаленный вызов метода). У меня та же проблема в этой ситуации, и я хочу, чтобы потоки этих процессов ждали, пока другие не прибудут в ту же точку, прежде чем продолжить. Я не могу использовать общий объект CyclicBarrier между различными процессами, потому что этот класс не сериализуем.

Каковы мои альтернативы для получения этого поведения барьера в потоках, выполняющихся в разных процессах на нескольких машинах?

Спасибо


person Fernando Magalhães    schedule 28.11.2013    source источник
comment
Вы можете настроить среду, в которой эта операция выглядит менее сложной. То есть, вот пример реализации Hazelcast, в котором используется распределенный AtomicNumber для подсчета прибывших партий.   -  person Andrey Chaschev    schedule 29.11.2013
comment
Даже если бы он был сериализуемым, он все равно не стал бы общим. Сериализация создает новую копию в целевом объекте, а не общий объект.   -  person user207421    schedule 29.11.2013


Ответы (1)


Вам не нужно передавать CyclicBarrier между процессами. Вы можете сделать вызов RMI, который, в свою очередь, использует CyclicBarrier. Я предлагаю вам взглянуть на HazelCast, он поддерживает распределенные Lock и многие другие коллекции.

ИМХО, я бы еще раз подумал, действительно ли вам нужны все процессы для проверки, и нашел бы способ избежать этого в первую очередь.

person Peter Lawrey    schedule 29.11.2013
comment
Вызов RMI, использующий CyclicBarrier, кажется хорошей идеей! Я также ищу асинхронные методы для решения этой проблемы (и избегания этой проблемы с синхронизацией процессов). HazelCast также кажется потрясающим. Я не уверен, смогу ли я его использовать, потому что я провожу этот эксперимент на стороннем кластере, и у меня нет большого контроля над машинами. Спасибо за советы. - person Fernando Magalhães; 29.11.2013