2013-08-18 5 views
0

У меня есть приложение со многими производителями и потребителями.LMAX Disruptor: Должен объект клонирования EventHandler, полученный от EventHandler # onEvent

С моей точки зрения, RingBuffer создает объекты в начале RingBuffer init, а затем вы копируете объект, когда публикуете в Ring и получаете их от него в EventHandler.

Мое приложение LogHandler буферизует полученные события в списке, чтобы отправить его в пакетном режиме еще раз, как только список достиг определенного размера. Поэтому EventHandler # onEvent помещает полученный объект в список, как только он достигнет размера, он отправляет его в RMI на сервер и очищает его.

Мой вопрос, нужно ли клонировать объект, прежде чем я помещу его в список, как я понимаю, после его использования они могут быть повторно использованы?

Нужно ли мне синхронизировать доступ к списку в моем EventHandler # onEvent?

ответ

0

Да - ваше понимание верное. Вы копируете свои значения в и из слотов ringbuffer.

Я бы предположил, что да, вы клонируете значения при извлечении из буфера кольца и в список обработчиков событий; в противном случае слот может быть повторно использован.

Вам не нужно синхронизировать доступ к списку, если он является частной переменной-членом вашего обработчика событий, и у вас есть только один экземпляр обработчика события для потока. Если у вас есть несколько обработчиков событий, добавляющих к тому же (например, статическому) экземпляру List, вам потребуется синхронизация.

1

Возможно использование слотов в RingBuffer Disruptor RingBuffer (включая те, которые содержат List) без значений клонирования/копирования. Это может быть предпочтительным решением для вас в зависимости от того, беспокоитесь ли вы о создании мусора и действительно ли вам нужно беспокоиться о параллельных обновлениях объектов, размещенных в RingBuffer. Если все объекты, помещенные в список слота, являются неизменяемыми или если они только обновляются или читаются одним потоком за раз (предварительное условие, которое Disruptor часто используется для обеспечения соблюдения), от клонирования их не будет ничего выиграть поскольку они уже невосприимчивы к гонкам данных.

Что касается пакетной обработки, обратите внимание, что сама инфраструктура Disruptor предоставляет механизм для приема элементов из RingBuffer пакетами в потоках EventHandler. Этот подход полностью потокобезопасен и не блокируется, и может обеспечить лучшую производительность, делая ваши шаблоны доступа к памяти более предсказуемыми для CPU.

 Смежные вопросы

  • Нет связанных вопросов^_^