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

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

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模型 最常用的模型,所有文件操作都是阻 […]

数据库(一)事务和隔离级别

数据库事务的四个特性(ACID) 1、原子性(Atomicity) 事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 2、一致性(Consistency) 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一 […]

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

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

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

Java提供了动态的装载特性;它会在运行时的第一次引用到一个class的时候对它进行装载和链接,而不是在编译期进行。JVM的类装载器负责动态装载,基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。Java类装载器有如下几个特点: 层级结构:Java里的类装载器被组织成了有父子关系的层级结构。Bootstrap类装载器是所有装载器的父亲。 代理模式:基于层级结构,类的 […]

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

 对象的分配的细节取决于当前使用哪一种垃圾收集器组合,以及和内存相关参数有关,本文主要讨论Serial/SerialOld收集器的内存分配和回收的策略,其他几种垃圾收集器可以自己去探讨。 先介绍下MinorGC和FullGC的概念。 新生代GC(MinorGC): 发生在新生代,Java对象大多都有朝生夕死的特性,MinorGC非常频繁,回收速度也比较快。 老年代GC(MajorGC/F […]

JavaSPI(一)基础实例

我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。 为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某 […]

Java注解(三)编译时注解

注解的处理除了可以在运行时通过反射机制处理外,还可以在编译期进行处理。 在编译期处理注解时,会处理到不再产生新的源文件为止,之后再对所有源文件进行编译。 在JDK6中,将注解处理器这一功能进行了规范化,形成了java.annotation.processing的API包,Mirror API则进行封装,形成javax.lang.model包。注解处理器的开发进行了简化,不再单独使用apt工具,而将 […]

Java注解(二)运行时注解

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用,读取注解的工具叫作注解处理器。 Java提供了两种方式来处理注解: 第一种是利用运行时反射机制; 另一种是使用Java提供的API来处理编译期的注解。 本文章主要讲解使用反射机制方式的注解处理器,仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解。 下面结合例子来说明这种方式的处理 […]