当前位置: 首页 > 后端技术 > Java

学习Disruptor时的一些联想和总结

时间:2023-04-01 22:36:28 Java

1.前言前两天做log4j2的时候不是遇到了Disruptor吗?不知道能不能从这个炸毁的并发框架中学到一些性能优化的思路。稍微研究一下源码,真的很有收获。对Disruptor感兴趣的朋友可以看看哈希大哥的博客。Disruptor上有系列文章,比较详细https://blog.csdn.net/zhxdick...2.RingBuffer大致看了下,好像所有的点都和RingBuffer有关,所以写标题作为环形缓冲区。Disruptor在初始化时会创建一个指定大小的RingBuffer。创建后大小不变,不会自动扩容,避免了频繁扩容带来的性能损失;存储数据的核心是条目数组变量。RingBuffer初始化的时候会预先分配数据【是不是有点像pooling】来填满数组;[数据内容为自定义事件对象]。这个逻辑可以在RingBuffer的父类RingBufferFields的实现中看到:this.bufferSize=sequencer.getBufferSize();if(bufferSize<1){thrownewIllegalArgumentException("bufferSize不能小于1");}if(Integer.bitCount(bufferSize)!=1){thrownewIllegalArgumentException("bufferSize必须是2的幂");}this.indexMask=bufferSize-1;this.entries=newObject[sequencer.getBufferSize()+2*BUFFER_PAD];//预分配对象fill(eventFactory);}privatevoidfill(EventFactoryeventFactory){for(inti=0;i实现Cursored、EventSequencer、EventSink{publicstaticfinallongINITIAL_CURSOR_VALUE=Sequence.INITIAL_VALUE;受保护的长p1、p2、p3、p4、p5、p6、p7;....}还有就是Disruptor这个大idea。在无锁Disruptor中,除了涉及到ReentrantLock的WaitStrategy之外,基本没有其他的锁操作,也就是CAS。在多线程环境下,线程越多,线程竞争越激烈,锁开销越大。这里甚至可以想到一些无锁的序列化应用实现,比如redis、netty。还有其他类似的无锁框架:java.util.concurrent.atomic包,Amino框架。文末?没什么好说的,如果对小伙伴们有什么启发,请关注我?。