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。
来自 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。