Java中并发无外乎多线程加锁等方式,平时用的比较多的就是util.concurrency下的一些工具。除此之外业界比较推崇的就是erlang、scala中较为流行的actor模型,该模型是著名的无锁模型,actor(可以简单认为是轻量线程)之间通过发送消息进行通信,由事件驱动,全程无锁。
最近看论坛发现了另外一个并发模型-disruptor。它比较特殊,其核心是ringbuffer,闲来无事做了个简单测试。用它来模拟典型的生产者-消费者问题,本例中一个消费者-一个生产者,并将disruptor和jdk提供的ArrayBlockingQueue做了对比,发现在本人的笔记本上前者比后者快将近10倍!
闲话少叙,直接贴代码,如有意见或问题欢迎拍砖。
public class BqTest { static boolean ft = true; static boolean z = true; /** * <b>Title:</b> main</br> * <b>Description:</b> * @param args void * @throws: * @author: shenbaise */ public static void main(String[] args) { BqTest bt = new BqTest(); bt.test(); } public void test(){ long cost = System.currentTimeMillis(); final BlockingQueue<Long> bq = new ArrayBlockingQueue<Long>(4096); Runnable p = new Runnable() { public void run() { for(int i= 0;i<100000000;i++){ try { bq.put((long) i); } catch (InterruptedException e) { e.printStackTrace(); } } ft = false; } }; Runnable c = new Runnable() { public void run() { while(ft || !bq.isEmpty()){ try { bq.take(); } catch (InterruptedException e) { e.printStackTrace(); } } z = false; } }; new Thread(c).start(); new Thread(p).start(); while(z){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("cost:"+(System.currentTimeMillis() - cost)); } }
disruptor的测试稍微麻烦点。
public final class ValueEvent { private long value; public long getValue() { return value; } public void setValue(final long value) { this.value = value; } public final static EventFactory<ValueEvent> EVENT_FACTORY = new EventFactory<ValueEvent>() { public ValueEvent newInstance() { return new ValueEvent(); } }; }
public class MyEventHandler implements EventHandler<ValueEvent>{ public long count = 0; public void onEvent(ValueEvent arg0, long arg1, boolean arg2) throws Exception { arg0.getValue(); // 为了公平这里什么都不做 } }
/** * @author shenbaise */ public class RbTest { private static final int BUFFER_SIZE = 4096; public static void main(String[] args) { RbTest test = new RbTest(); test.test(); } public void test() { long cost = System.currentTimeMillis(); RingBuffer<ValueEvent> ringBuffer = createSingleProducer(ValueEvent.EVENT_FACTORY, BUFFER_SIZE, new YieldingWaitStrategy()); SequenceBarrier sequenceBarrier = ringBuffer.newBarrier(); MyEventHandler handler = new MyEventHandler(); BatchEventProcessor<ValueEvent> batchEventProcessor = new BatchEventProcessor<ValueEvent>(ringBuffer, sequenceBarrier, handler); ringBuffer.addGatingSequences(batchEventProcessor.getSequence()); ExecutorService executor = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory); executor.submit(batchEventProcessor); final RingBuffer<ValueEvent> rb = ringBuffer; for (long i = 0; i < 100000000; i++) { long next = rb.next(); rb.get(next).setValue(i); rb.publish(next); } batchEventProcessor.halt(); System.out.println("cost:"+(System.currentTimeMillis() - cost)); } }
最终ArrayBlockingQueue需要越20秒,而disruptor仅2秒左右。
测试环境:
写道
jdk7
主机名: WHITEME-PC
OS 名称: Microsoft Windows 7 旗舰版
系统制造商: LENOVO
系统型号: INVALID
系统类型: x64-based PC
处理器: 安装了 1 个处理器。
[01]: Intel64 Family 6 Model 37 Stepping 5 GenuineIntel ~2533 Mhz
BIOS 版本: LENOVO 2ECN29WW , 2010/9/21
物理内存总量: 3,957 MB
可用的物理内存: 987 MB
虚拟内存: 最大值: 7,911 MB
虚拟内存: 可用: 4,344 MB
虚拟内存: 使用中: 3,567 MB
主机名: WHITEME-PC
OS 名称: Microsoft Windows 7 旗舰版
系统制造商: LENOVO
系统型号: INVALID
系统类型: x64-based PC
处理器: 安装了 1 个处理器。
[01]: Intel64 Family 6 Model 37 Stepping 5 GenuineIntel ~2533 Mhz
BIOS 版本: LENOVO 2ECN29WW , 2010/9/21
物理内存总量: 3,957 MB
可用的物理内存: 987 MB
虚拟内存: 最大值: 7,911 MB
虚拟内存: 可用: 4,344 MB
虚拟内存: 使用中: 3,567 MB
相关推荐
介绍无锁并行计算框架Disruptor,并进行压力测试与JDK的BlockingQueue进行性能对比。 2. 无锁并行计算框架核心 学习无锁并行计算框架的基础使用与API。 介绍内部各种组件的原理和运行机制。 3. 无锁并行计算...
Disruptor是一款高性能的并发框架,它通过使用Ring Buffer和基于事件的处理方式来消除锁竞争,提升系统性能。在使用Disruptor过程中,开发者可能会遇到`FatalExceptionHandler`的错误,这通常是由于处理流程中的异常...
Disruptor 是一个高性能的并发编程框架,由 LMAX 公司开发,旨在解决线程间数据交换的效率问题。它的设计目标是替代传统的有界队列,提供更高的吞吐量和更低的延迟。Disruptor 的核心在于其创新的数据交换机制,包括...
《Disruptor 框架详解与应用实例》 ...总的来说,这个压缩包提供了一个了解和学习 Disruptor 的良好起点,通过阅读源码、示例代码和 API 文档,我们可以深入了解这个框架如何帮助我们构建高并发、低延迟的应用系统。
本项目是一个深入学习Java并发编程和无锁并行计算框架Disruptor的课程源代码。通过本项目,你将学习到并发编程的核心概念、无锁并行计算框架的基础使用与高级特性,以及如何整合Disruptor与Netty构建高性能的网络...
最后,JMH(Java Microbenchmark Harness)是一个用于基准测试的框架,它可以帮助开发者编写简单、准确的性能测试代码。Disruptor是一个高性能的事件处理框架,它使用环形数组结构来处理事件,可以在单机环境下提供...
3. **性能测试**:对比使用Disruptor前后的性能,理解其在高并发场景下的优势。 4. **深入研究**:学习Disruptor的高级特性,如工作窃取策略、事件工厂和事件处理器链等。 总之,Disruptor是Java并发编程领域的一...
测试结果显示,Disruptor处理相同数量的消息仅花费7458毫秒,明显优于ArrayBlockingQueue,这体现了Disruptor在高并发处理中的优势。 Disruptor的主要特性包括: 1. **无锁设计**:Disruptor使用了序列号...
总的来说,Disruptor是Android开发者应对高并发挑战的一个强大工具,它的出现改变了我们对并发编程的认知,提供了一种新的优化并发性能的方法。通过深入学习和实践,开发者可以更好地利用Disruptor,为Android应用...
《Disruptor并发模式在C++中...通过理解和掌握这一模式,开发者能够在处理高并发场景时,实现更流畅、更快速的系统性能。在实践中,我们需要根据具体的应用场景和需求,灵活运用Disruptor模式,以达到最优的并发性能。
LMAX Disruptor是由LMAX公司开发的一款高性能、低延迟的消息传递框架,最初是用Java编写的。它的核心设计理念是通过消除传统锁机制,采用无锁数据结构和单向事件传递路径,以达到极致的并发性能。在本文中,我们将...
在IT行业中,并发编程是提升系统性能和效率的关键技术,特别是在多核处理器和高并发应用场景中。本项目“并发编程demo”聚焦于Java平台上的并发处理,主要利用了`java.util.concurrent`包中的工具和机制。这个包包含...
而Log4j2的一个显著特性是支持异步日志写入,这种模式可以显著提高系统的整体性能,特别是在高并发环境下。 本文主要探讨Log4j2异步写日志的效率,通过源码分析和测试来展示其优势。首先,我们要理解Log4j2中的异步...
相比传统的同步日志记录,Log4j2引入了异步日志记录模式,这一特性使得日志处理速度显著提升,尤其在高并发场景下,能够避免日志记录成为系统性能瓶颈。 Log4j2的核心组件包括配置器、日志事件、布局和Appender。...
《Disruptor框架详解——基于myDisruptor.zip资源》 Disruptor是英国LMAX公司开发的一款高性能、低延迟的并发处理框架,它通过...在实际项目中,尤其是在高并发、低延迟的场景下,Disruptor是值得考虑和采用的利器。
在并发编程方面,文档涉及了JUC并发工具包、无锁并发框架Disruptor和线程基础与高级特性,这些都是提升Java并发处理能力的必备知识点。 此外,文档还包含Java虚拟机(JVM)深入知识的学习路径,如内存模型、垃圾...
LMAX旨在成为世界上最快的交易平台。 显然,为了实现这一目标,我们需要做一些特殊的事情,... Disruptor是一种通用机制,用于解决并发编程中的难题。 它的工作方式与传统方法不同,因此您使用它的方式可能会有所不同。
b、对于业务逻辑简单,要求高并发高响应的场景,改组件同样适用,经测试,在同等条件下, 吞吐率比Disruptor快10倍以上 工具类 cn.com.common.util.concurrent.spmc.original.OriginalSpmc 测试类(可作为使用示例...
Disruptor是由LMAX公司开发的一种高性能的并发数据处理框架,它通过消除锁和减少内存屏障来实现极低的延迟。在订单匹配引擎中,Disruptor可以作为事件处理器,高效地管理订单的创建、匹配和取消等操作。 首先,理解...