LMAX Disruptor:必须从EventHandler#onEvent接收的EventHandler克隆对象

时间:2013-08-18 14:05:00

标签: disruptor-pattern lmax

我有许多制作人和消费者的应用程序。

根据我的理解,RingBuffer在RingBuffer初始化时创建对象,然后在Ring中发布时复制对象并在EventHandler中从中获取它们。

我的应用程序LogHandler缓冲List中的已接收事件,以便在列表达到特定大小后以批处理模式进一步发送它。因此,EventHandler#onEvent将接收到的对象放入列表中,一旦达到大小,就会将它在RMI中发送到服务器并清除它。

我的问题是,在放入列表之前是否需要克隆对象,据我所知,一旦消耗它们就可以重复使用?

我是否需要在EventHandler#onEvent中同步对列表的访问权限?

2 个答案:

答案 0 :(得分:1)

可以在Disruptor的RingBuffer中使用插槽(包括包含List的插槽),而无需克隆/复制值。这可能是一个更好的解决方案,取决于您是否担心垃圾创建,以及您是否真的需要关注对RingBuffer中放置的对象的并发更新。如果放在槽列表中的所有对象都是不可变的,或者它们一次只被一个线程更新/读取(Disruptor经常被用来强制执行的前提条件),那么克隆它们就没有任何好处因为他们已经对数据竞赛免疫了。

关于批处理的主题,请注意Disruptor框架本身提供了一种机制,用于在EventHandler线程中批量从RingBuffer中获取项目。这种方法是完全线程安全且无锁定的,并且通过使您的内存访问模式对CPU更具可预测性,可以产生更好的性能。

答案 1 :(得分:0)

是的 - 您的理解是正确的。您可以将值复制到ringbuffer插槽中。

我建议您在将值从环形缓冲区中提取并进入事件处理程序列表时克隆值;否则插槽可以重复使用。

只要它是事件处理程序的私有成员变量,并且每个线程只有一个事件处理程序实例,就不需要同步对列表的访问。如果您有多个事件处理程序添加到相同(例如静态)List实例,那么您将需要同步。