Disruptor(一)RingBuffer数据结构

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

深入理解Disruptor

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

Netty(一)网络IO基础

在讨论 IO 的时候,参与者通常有两个角色:系统内核和用户进程。用户进程发送 IO 请求过后,系统内核在准备好 IO 数据后,会通过内存拷贝的方式,将准备好的缓存 IO 数据共享给用户进程缓存。 网络 I/O 模型简介根据 UNIX 网络编程对 I/O 模型的分类,提供了阻塞 I/O 模型、非阻塞 I/O 模型、I/O 复用模型、信号驱动 I/O 模型、异步 I/O 这 5 种 I/O 模型。 1、阻塞 I/O 模型最常用的模型,所有文件操作都是阻塞的。套接字 socket 在进程空间中调用 recvfr ...

JVM(七)深入理解java内存模型

java 线程之间的通信对程序员完全透明,内存可见性问题很容易困扰 java 程序员,本文试图揭开 java 内存模型神秘的面纱。 本文大致分三部分:重排序与顺序一致性;三个同步原语(lock,volatile,final)的内存语义,重排序规则及在处理器中的实现;java 内存模型的设计目标,及其与处理器内存模型和顺序一致性内存模型的关系。 深入理解 java 内存模型(一)——基础 深入理解 java 内存模型(二)——重排序 深入理解 java 内存模型(三)——顺序一致性 深入理解 java 内存模型(四)——volatile 深入理解 java 内存模型(五)——锁 深入理解 ...

JVM(五)虚拟机类加载机制

Java 提供了动态的装载特性;它会在运行时的第一次引用到一个 class 的时候对它进行装载和链接,而不是在编译期进行。JVM 的类装载器负责动态装载,基本上所有的类加载器都是 java.lang.ClassLoader 类的一个实例。 Java 类装载器有如下几个特点: 层级结构:Java 里的类装载器被组织成了有父子关系的层级结构。Bootstrap 类装载器是所有装载器的父亲。 代理模式:基于层级结构,类的装载可以在装载器之间进行代理。当装载器装载一个类时,首先会检查它是否在父装载器中进行装载了。如果上层的装载器已经装载了这个类,这个类会被直接使用。反之,类装载器会请求装载这个类。 ...

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

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

JVM(四)类文件结构解析

Java Class 文件结构如下图所示对于以下 java 源文件代码 public class Charles implements ICharles{ private String name; public void say() { System.out.println("charles"); } public String getName() { return name; } public void setName(String name) { this.nam ...

JVM(三)内存分配与回收策略

对象的分配的细节取决于当前使用哪一种垃圾收集器组合,以及和内存相关参数有关,本文主要讨论 Serial/SerialOld 收集器的内存分配和回收的策略,其他几种垃圾收集器可以自己去探讨。先介绍下 MinorGC 和 FullGC 的概念。新生代 GC(MinorGC): 发生在新生代,Java 对象大多都有朝生夕死的特性,MinorGC 非常频繁,回收速度也比较快。老年代 GC(MajorGC/FullGC): 发生在老年代,出现 MajorGC 经常至少伴随一次的 MinorGC,但非绝对。MajorGC 的速度一般比 MinorGC 慢 10 倍以上。下面是最普遍的内 ...