LMAX Disruptor 事件中的 class 字段是否需要可变?

Do class fields within an LMAX Disruptor event need to be volatile?

来自 LMAX Disruptor 的示例代码 "Getting Started"...

public class LongEvent
{
    private long value;

    public void set(long value)
    {
        this.value = value;
    }
}

参考:https://github.com/LMAX-Exchange/disruptor/wiki/Getting-Started

为什么 private long value 没有声明为 volatile

我问是因为,隐含在 Disruptor 模式中,数据在线程之间共享(生产者 -> 消费者)。

我的猜测:生产者线程和消费者线程之间已经(至少)存在一个内存栅栏。

Peter 的评论提供了一个很好的线索,事实上,是的,涉及内存栅栏。

可以看到在Sequence中使用了一个putOrderedLong() compareAndSet()等等class。这些中的每一个都强制执行内存排序。

有关详细信息,请参阅 source code