Distruptor无锁队列实现说明

Distruptor无锁队列实现说明
1、Volatile仅保证线程间读、写立刻可见且禁用cpu指令顺序优化2、Volatile只能用于单cpu指令的操作如实现Volatile.Read(ref x)或Volatile.Writle(ref x, 10); 即最简单的读取或赋值不能做x、if(x10) x;等多cpu指令操作3、如存在两个cpu同时执行Volatile操作不保证串行因仅单cpu指令读、写都可能提前发生读到的内容可能是旧值也可能是新值读到的内容可理解成是内存地址的瞬间快照4、单线程赋值写入x1; Volatile.Write(flag)搭配另一线程 Volatile.Read是它的舒适区其他复杂场景如多线程读、多线程写需引入CAS或锁5、对于保护的数据是单调递增或递减场景多个线程写需配合interlocked.CompareChange判断是否写入成功不成功继续重试即可实现线程排队操作多个线程读取判断拿到快照数据后和预期数据做比较单调性很重要判断是否符合预期可能读到的数据比预期数据大则后续处理需执行多次6、disruptor环形队列中多生产者执行逻辑1生产者获取消费者当前消费数据位置2判断当前写入位置是否追上消费位置如追上等待并继续判断3可以写入数据后获取写入位置当前位置加1位置数据持续增加用位运算获取可用环形队列索引4使用Interlocked.CompareExchange尝试修改CurrentWritePos如被其他线程先行修改过写入失败需重复1-- 4步骤如写入成功则成功占用了这个队列节点后续可以将数据写入节点并更新节点最新序号数组7、distruptor环形队列中多消费者执行逻辑1循环判断是否有可用节点2生产者写入成功时在节点状态数组中对应节点位置写入最新的序号3消费者找到大于当前位置的序号得到可消费节点一或多个4消费一或多个节点数据