Java8(一)FunctionalInterface

主要内容 什么是函数式接口(Functional Interface) 函数式接口用途 关于@FunctionalInterface注解 函数式接口里允许定义默认方法 函数式接口里允许定义静态方法 函数式接口里允许定义java.lang.Object里的public方法 JDK中的函数式接口举例 1、什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在 ...

Disruptor(五)DSL相关实战

本文主要讲解使用Disruptor的DSL演示生产者和消费者的数据交换,和以往的线程间通信不同,disruptor使用消息传递的方式,通过RingBuffer进行线程间的数据传递和通信,下面分别从一对一和多对一的模型进行讲解。 下面主要通过计算区间[0 , 100000000)中的所有数值相加为例子讲解Disruptor中的dsl使用。 1、一对一 一个生产者和一个消费者之间进行数据传递,使用disruptor主要涉及到RingBuffer中的ValueEvent定义,V ...

Disruptor(四)RingBuffer多生产者写入

上一章主要介绍了单个生产者如何向RingBuffer数据写入数据,如何不要让Ring重叠,写入后通知消费者,生产者一端的批处理,以及多个生产者如何协同工作,本章主要介绍多生产者向RingBuffer数据写入数据。 1、多生产者MultiProducerSequencer申请下一个节点 和单生产者不同的是在next方法中会直接通过cursor.compareAndSet(current, next)设置生产者的游标cursor的sequence。大家很可能会问设置了生产 ...

Disruptor(三)RingBuffer单生产者写入

上一章主要介绍了消费者从RingBuffer读取数据,本章主要介绍单个生产者如何向RingBuffer数据写入数据。在RingBuffer数据写入过程中如何不要让Ring重叠,写入后通知消费者,生产者一端的批处理,以及多个生产者如何协同工作。 在RingBuffer写入数据的过程涉及到两阶段提交(two-phasecommit) 1)生产者需要申请buffer里的下一个节点。 2)当生产者向节点写完数据,需要调用调用publish发布数据。 1、单个生产者Single ...

Disruptor(二)RingBuffer读取

上一章主要介绍Ring Buffer的数据结构,本章主要讲解如何使用Disruptor从Ring Buffer中读取数据。 1、消费者通过ProcessingSequenceBarrier读取数据 能够读取数据的前提是数据已经写入到Ring Buffer中,关于数据的写入,后面一章节会详细讲解。 RingBuffer的元素的大小是2的n次方(上面ringBufferSize为8,从序号0开始)。消费者(Consumer)是一个想从RingBuffer里读取数据的 ...

深入理解Disruptor

Disruptor是LMAX公司开源的一个高效的内存无锁队列,一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件-监听模式的实现,直接称disruptor模式。disruptor最大特点是高性能,其LMAX架构可以获得每秒6百万订单,用1微秒的延迟获得吞吐量为100K+。理解Disruptor的原理,可以帮助我们更好的理解内存无锁,CAS,volatile,缓冲行等并发原理。 本文主要从以下方面介绍disruptor: ...

Disruptor(一)Disruptor概念和RingBuffer数据结构

Disruptor是LMAX公司开源的一个高效的内存无锁队列。 谈到并发程序设计,有几个概念是避免不了的。 1、锁: 锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。用户态的锁虽然避免了这些问题,但是其实它们只是在没有真实的竞争时才有效。 2、CAS: CAS的涵义不多介绍了。使用CAS时不像上锁那样需要一次上下文切 ...

JVM(六)虚拟机类加载委派模型

双亲委派模型 当一个类装载器(class loader)被请求装载类时,它首先按照顺序在上层装载器、父装载器以及自身的装载器的缓存里检查这个类是否已经存在。简单来说,就是在缓存里查看这个类是否已经被自己装载过了,如果没有的话,继续查找父类的缓存,直到在bootstrap类装载器里也没有找到的话,它就会自己在文件系统里去查找并且加载这个类。 ClassLoader的loadClass方法 protected Class<?> loadClass(String name ...