Disruptor

java-CPU Cache 与缓存行 转

末鹿安然 提交于 2020-04-15 13:10:06
【推荐阅读】微服务还能火多久?>>> 出处: Java编程如何高效利用CPU缓存? 引言 首先我们来看一个Java的例子: public class Main { static long [][] arr; public static void main(String[] args) { arr = new long [1024 * 1024][8 ]; // 横向遍历 long marked = System.currentTimeMillis(); for ( int i = 0; i < 1024 * 1024; i += 1 ) { for ( int j = 0; j < 8; j++ ) { sum += arr[i][j]; } } System.out.println( "Loop times:" + (System.currentTimeMillis() - marked)+ "ms" ); marked = System.currentTimeMillis(); // 纵向遍历 for ( int i = 0; i < 8; i += 1 ) { for ( int j = 0; j < 1024 * 1024; j++ ) { sum += arr[j][i]; } } System.out.println( "Loop times:" + (System

分析源码,学会正确使用 Java 线程池

雨燕双飞 提交于 2020-04-13 01:22:41
本文作者:oschina_2020 在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等。本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议。文中会稍微涉及到一些线程池实现原理方面的知识,但是不会过多展开。 线程池的异常处理 UncaughtExceptionHandler 我们都知道Runnable接口中的run方法是不允许抛出异常的,因此派生出这个线程的主线程可能无法直接获得该线程在执行过程中的异常信息。如下例: public static void main(String[] args) throws Exception { Thread thread = new Thread(() -> { Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS); System.out.println(1 / 0); // 这行会导致报错! }); thread.setUncaughtExceptionHandler((t, e) -> { e.printStackTrace(); //如果你把这一行注释掉,这个程序将不会抛出任何异常. }); thread.start(); } 为什么会这样呢?其实我们看一下Thread中的源码就会发现

分析源码,学会正确使用 Java 线程池

做~自己de王妃 提交于 2020-04-10 01:29:49
本文作者:oschina_2020 在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等。本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议。文中会稍微涉及到一些线程池实现原理方面的知识,但是不会过多展开。 线程池的异常处理 UncaughtExceptionHandler 我们都知道Runnable接口中的run方法是不允许抛出异常的,因此派生出这个线程的主线程可能无法直接获得该线程在执行过程中的异常信息。如下例: public static void main(String[] args) throws Exception { Thread thread = new Thread(() -> { Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS); System.out.println(1 / 0); // 这行会导致报错! }); thread.setUncaughtExceptionHandler((t, e) -> { e.printStackTrace(); //如果你把这一行注释掉,这个程序将不会抛出任何异常. }); thread.start(); } 为什么会这样呢?其实我们看一下Thread中的源码就会发现

分析源码,学会正确使用 Java 线程池

帅比萌擦擦* 提交于 2020-04-08 01:33:39
本文作者:oschina_2020 在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等。本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议。文中会稍微涉及到一些线程池实现原理方面的知识,但是不会过多展开。 线程池的异常处理 UncaughtExceptionHandler 我们都知道Runnable接口中的run方法是不允许抛出异常的,因此派生出这个线程的主线程可能无法直接获得该线程在执行过程中的异常信息。如下例: public static void main(String[] args) throws Exception { Thread thread = new Thread(() -> { Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS); System.out.println(1 / 0); // 这行会导致报错! }); thread.setUncaughtExceptionHandler((t, e) -> { e.printStackTrace(); //如果你把这一行注释掉,这个程序将不会抛出任何异常. }); thread.start(); } 为什么会这样呢?其实我们看一下Thread中的源码就会发现

分析源码,学会正确使用 Java 线程池

有些话、适合烂在心里 提交于 2020-04-05 22:37:35
本文作者:oschina_2020 在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等。本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议。文中会稍微涉及到一些线程池实现原理方面的知识,但是不会过多展开。 线程池的异常处理 UncaughtExceptionHandler 我们都知道Runnable接口中的run方法是不允许抛出异常的,因此派生出这个线程的主线程可能无法直接获得该线程在执行过程中的异常信息。如下例: public static void main(String[] args) throws Exception { Thread thread = new Thread(() -> { Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS); System.out.println(1 / 0); // 这行会导致报错! }); thread.setUncaughtExceptionHandler((t, e) -> { e.printStackTrace(); //如果你把这一行注释掉,这个程序将不会抛出任何异常. }); thread.start(); } 为什么会这样呢?其实我们看一下Thread中的源码就会发现

JVM源码分析之javaagent原理完全解读

北城余情 提交于 2020-03-24 10:52:38
3 月,跳不动了?>>> 本文来自 PerfMa社区,欢迎关注公众号 链接: https://club.perfma.com/article/150614 问题描述 当我们一个系统既需要mysql驱动,也需要oracle驱动的时候,在并发加载初始化这些驱动类的过程中产生死锁的可能性非常大,下面是一个模拟的例子,对于Thread2的实现其实是jdk里java.sql.DriverService的逻辑,也是我们第一次调用java.sql.DriverManager.registerDriver注册一个驱动实例要走的逻辑(jdk1.6下),不过这篇文章是使用我们生产环境的一个系统的线程dump和内存dump为基础进行分析展开的。 如果以上代码运行过程中发现有线程一直卡死在Class.forName的调用里,那么说明问题已经重现了。 先上两张图 内存态线程堆栈 线程堆栈 存疑点 仔细看看上面的线程dump分析和内存dump分析里的线程分析模块,您可能会有如下两个疑惑: 【为什么线程[Thread-0]一直卡在Class.forName的位置】:这有点出乎意料,做一个类加载要么找不到抛出ClassNotFoundException,要么找到直接返回,为什么会一直卡在这个位置呢? 【明明[Thread-0]注册的是mysql驱动为什么会去加载Odbc的驱动类】:通过[Thread-0

蚂蚁金服分布式链路跟踪组件 SOFATracer 中 Disruptor 实践(含源码)

拟墨画扇 提交于 2020-03-18 11:21:22
某厂面试归来,发现自己落伍了!>>> SOFA Stack( S calable O pen F inancial A rchitecture Stack)是蚂蚁金服自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。 SOFATracer 是一个用于分布式系统调用跟踪的组件,通过统一的 TraceId 将调用链路中的各种网络调用情况以日志的方式记录下来,以达到透视化网络调用的目的,这些链路数据可用于故障的快速发现,服务治理等。 SOFATracer: https://gitee.com/sofastack/sofa-tracer Disruptor 简介 Disruptor 旨在在异步事件处理体系结构中提供低延迟,高吞吐量的工作队列。它确保任何数据仅由一个线程拥有以进行写访问,因此与其他结构相比,减少了写争用。目前,包括 Apache Storm、Camel、Log4j 2 在内的很多知名项目都应用了 Disruptor 以获取高性能。 SOFATracer 也是基于 Disruptor 高性能无锁循环队列来提供异步打印日志到本地磁盘能力的,SOFATracer 提供两种类似的日志打印类型即摘要日志和统计日志,摘要日志:每一次调用均会落地磁盘的日志;统计日志:每隔一定时间间隔进行统计输出的日志;无论是哪种日志的输出,对于

【 Disruptor 】- 1 Disruptor 介绍

拜拜、爱过 提交于 2020-02-28 09:53:52
并发编程网 1 什么是 Disruptor Martin Fowler 在自己网站上写了一篇 LMAX 架构的文章,在文章中他介绍了 LMAX 是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在 JVM 平台上,其核心是一个业务逻辑处理器, 它能够在一个线程里每秒处理 6 百万订单 。业务逻辑处理器完全是运行在内存中,使 用 事件源驱动方式 。业务逻辑处理器的核心是 Disruptor`。 Disruptor 它是一个开源的并发框架,并获得 2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的 Queue 并发操作。 Disruptor 是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的 JMS ),也可以认为是一个观察者模式的实现,或者事件监听模式的实现。 在使用之前,首先说明 disruptor 主要功能加以说明,你可以理解为他是一种高效的 生产者-消费者 模型。也就性能远远高于传统的 BlockingQueue 容器。 在 JDK 的多线程与并发库一文中,提到了 BlockingQueue 实现了 生产者-消费者模型 。 BlockingQueue 是基于锁实现的, 而锁的效率通常较低。有没有使用 CAS 机制实现的 生产者-消费者 , Disruptor 就是这样。 Disruptor 使用 观察者模式

disruptor并发框架的使用

佐手、 提交于 2020-02-28 06:58:22
springboot 项目中disruptor并发框架的使用 1、导包 <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-disruptor-starter</artifactId> <version>2.25.0</version> </dependency> 2、一个数据封装类 /** * 数据封装类 * Created by liunanhua on 2018/7/19. */ public class LongEvent { private long value; public long getValue() { return value; } public void setValue(long value) { this.value = value; } } 数据封装类工厂 /** * LongEven工厂 * Created by liunanhua on 2018/7/19. */ public class LongEventFactory implements EventFactory<LongEvent> { @Override public LongEvent newInstance() { return new LongEvent(); } } 3、一个生产者 import

Disruptor并发框架,核心组件RingBuffer

╄→尐↘猪︶ㄣ 提交于 2020-01-21 01:57:25
1.1 Disruptor并发框架简介 Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使用事件源驱动方式。业务逻辑处理器的核心是Disruptor。 Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作。 Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现。 1.2 Disruptor并发框架使用 目前我们使用disruptor已经更新到了3.x版本,比之前的2.x版本性能更加的优秀,提供更多的API使用方式。 下载disruptor-3.3.2.jar引入我们的项目既可以开始disruptor之旅。 在使用之前,首先说明disruptor主要功能加以说明,你可以理解为他是一种高效的"生产者-消费者"模型。也就性能远远高于传统的BlockingQueue容器。 官方学习网站:http://ifeve.com/disruptor-getting-started/