专注java技术,热爱长跑和阅读开源代码 邮箱 lebron374@163.com
开篇 整个博文希望能够讲清楚Disruptor的producer和consumer的处理过程以及两者之间的消息通知机制。 工作过程 Disruptor本质上是一个内存消息队列,适合生产者消费者模型,所以它的整个工作过程其实也就分三个大过程,分别是Disruptor本身启动、Disruptor生产者工作过程、Disruptor消费者工作过程。
开篇 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题。与Kafka、RabbitMQ用于服务间的消息队列不同,disruptor一般用于线程间消息的传递。
开篇 相比jdk1.7,ConcurrentHashMap在jdk1.8当中有了很大的变化,从大神们的总结中拷贝了一些改进点便于大家有个印象,总结出来有以下几点: jdk1.8的ConcurrentHashMap不再使用Segment代理Map操作这种设计,整体结构变为HashMap这种结构,但是依旧保留分段锁的思想。
开篇 ThreadLocal主要解决的问题是给每个线程绑定自己的值,这个值是和线程绑定的,是线程的局部变量,是其他线程没法访问的。 ThreadLocal的源码的核心知识点在于ThreadLocal变量如何跟线程绑定和ThreadLocal如何实现gc垃圾回收,这篇文章希望能够讲解清楚这两个知识点。
开篇 The AtomicReference class provides reference objects that may be read and written atomically, so when multiple threads try to reach them at the same time, only one will be able to do so. 换句话说就是AtomicReference提供Object对象的原子类操作,提供了更加灵活的操作。
开篇 AtomicLong位于java.util.concurrent.atomic包下,是java提供给的可以保证数据的原子性操作的一个类。和AtomicInteger的实现几乎是一致的。
开篇 AtomicInteger位于java.util.concurrent.atomic包下,是java提供给的可以保证数据的原子性操作的一个类。 Atomicxxxx系列主要核心在于Unsafe这个类的运用保证线程安全,而Unsafe这个类应该是通过JNI调用的底层实现。
开篇 AtomicBoolean位于java.util.concurrent.atomic包下,是java提供给的可以保证数据的原子性操作的一个类。 Atomicxxxx系列主要核心在于Unsafe这个类的运用保证线程安全,而Unsafe这个类应该是通过JNI调用的底层实现。
开篇 Deque 接口继承自 Queue接口,但 Deque 支持同时从两端添加或移除元素,因此又被成为双端队列。鉴于此,Deque 接口的实现可以被当作 FIFO队列使用,也可以当作LIFO队列(栈)来使用。
厦门旅行的最后一天,位于酒店旁边的麦当劳,我又忍不住开始用文字记录短暂的厦门之行。 厦门之行,不一样的厦门之行,没有满屏的美食照片,没有满屏的风景照片,有的只是零星的个人足迹。
开篇 PriorityQueue是具备了小根堆性质的数据结构也就是优先队列PriorityQueue,内部实现是一个堆排序的数据结构。 PriorityQueue的逻辑结构是一棵完全二叉树,存储结构其实是一个数组。
开篇 DelayedQueue是一个用来延时处理的队列,delayQueue其实就是在每次往优先级队列中添加元素,然后以元素的delay/过期值作为排序的因素,以此来达到先过期的元素会拍在队首,每次从队列里取出来都是最先要过期的元素 所谓延时处理就是说可以为队列中元素设定一个过期时间, 相关的操作受到这个设定时间的控制。
开篇 PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素是二叉树最小堆的实现。 使用数组存储的时候i结点的父结点下标就为(i–1)/2。
开篇 LinkedBlockingQueue是一个基于链表实现的可选容量的线程安全的阻塞队列。队头的元素是插入时间最早的,队尾的元素是最新插入的。新的元素将会被插入到队列的尾部。
开篇 ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。 线程安全是指ArrayBlockingQueue内部通过“互斥锁”保护竞争资源,实现了多线程对竞争资源的互斥访问。
开篇 Stack是List的实现类当中最简单的,用一句话形容Stack那就是Stack在Vector的基础上采用Vector的特性来达到Stack的目标。
开篇 今天某同事在spring结合H2实现mybatis DAO层单测的时候遇到一个问题,本着人道主义临时支持下我司大xx业务,就帮忙一起看了下,回想一下整个过程还是挺有意思的,就顺便写了这篇文章来记录一下,方便后面的人能够通过搜索引擎检索到。
开篇 Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。
开篇 LinkedList基于链表实现,在List中间进行插入和删除的代价较低,提供了优化的顺序访问。LinkedList在随机访问方面相对比较慢,但是它的特性集较ArrayList更大。
开篇 ArrayList主要由如下特性: ArrayList实际上是通过一个数组去保存数据的,当我们构造ArrayList时,如果使用默认构造函数,ArrayList的默认容量大小是10。
开篇 作为Map系列的最后一篇,我觉得有必要讲讲WeakHashMap这个类,因为这个类可以解决一些oom的问题,典型的场景是在一个HashMap中put不同的key/value对象,如果此时设置key为null而未清除map当中的key对象,那么就无法通过gc回收该对象。
开篇 LinkedHashSet按照元素插入的顺序进行迭代,即迭代输出的顺序与插入的顺序保持一致。 LinkedHashSet类图 LinkedHashSet类图 LinkedHashSet构造函数 LinkedHashSet继承自HashSet,而在HashSet的构造函数当中我们构建了一个LinkedHashMap对象,所以LinkedHashSet的实现其实是依赖于LinkedHashMap实现的。
开篇 TreeSet作为HashSet的姊妹类型,TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列。 TreeSet类图 TreeSet类图 TreeSet类图 TreeSet秉承了HashSet的一贯做法,内部通过Map来保存key/value数据,由于Set只保存key,所以内部的Map的value公用了一个定义的Object对象PRESENT。
开篇 Hashtable作为jdk提供的最原始的key/value存储结构,属于线程安全系列的,所以这边顺便把这个类分析一下,基本上如果你看过了HashMap相关的数据结构,这个看起来就是小菜一碟了。
开篇 写TreeMap本身是一件让我感到无比怂逼的事情,因为红黑树的数据结构从大学到现在我就没弄明白过,估计在很长的一段时间里应该也弄不明白,不过我打算投入点时间去研究研究红黑树了。
开篇 LinkedHashMap是HashMap的变种,有一些额外的特性其中最重要的就是维护数据插入的有序性,这篇文章就是为了讲清楚LinkedHashMap的实现细节。
开篇 这篇文章的主要是想把HashMap进行一个讲解,在上一篇java源码-HashSet当中其实已经提到过了一点点HashMap的源码实现了,这篇文章会更加详细的进行讲解,顺带会讲解一些比较奇妙的源码实现。
开篇 当抛弃所有虚的东西之外,我决定好好的把java的基础再过一遍,包括java源码、effective java、阿里的java代码编程规范。希望能够进一步夯实自己的基础,增加自己的底气。
diagram.png java集合图.jpg
五步流程法.png 五步流程成为java架构师.png
开篇 按照惯例先说说为什么会想写这个话题,最初是因为看到公众号推送了一篇阿里的持续集成发布系统的文章让我对这个分支管理发布的CI/CD流程产生了兴趣,顺带就花了半天时间研究了一下。
Memcached源码分析 - 网络模型(1)Memcached源码分析 - 命令解析(2)Memcached源码分析 - 数据存储(3)Memcached源码分析 - 增删改查操作(4)Memcached源码分析 - 内存存储机制Slabs(5)Memcached源码分析 - LRU淘汰算法(6)Memcached源码分析 - 消息回应(7) 开篇 这篇文章作为Memcached源码系列的最后一篇文章,主要是为了讲解清楚Memcached在响应请求的流程,整个过程我总结一下分为协议部分、准备发送报文、执行报文发送、结束报文发送 四大块内容。
Memcached源码分析 - 网络模型(1)Memcached源码分析 - 命令解析(2)Memcached源码分析 - 数据存储(3)Memcached源码分析 - 增删改查操作(4)Memcached源码分析 - 内存存储机制Slabs(5)Memcached源码分析 - LRU淘汰算法(6)Memcached源码分析 - 消息回应(7) Memcached的LRU几种策略 惰性删除。
不知不觉在阅读开源代码的这条路上已经坚持了4个月,今天心血来潮想给自己作个阶段性的总结,不为别的就想让自己重新找回阅读源码的那个初心。 回想当初决定投入精力看源码的初衷,其实就是为了增加竞争力然后谈个好价钱,很现实也很简单,现在依然如此。
Memcached源码分析 - 网络模型(1)Memcached源码分析 - 命令解析(2)Memcached源码分析 - 数据存储(3)Memcached源码分析 - 增删改查操作(4)Memcached源码分析 - 内存存储机制Slabs(5)Memcached源码分析 - LRU淘汰算法(6)Memcached源码分析 - 消息回应(7) 开篇 这篇文章的目的是想把Memcached的内存管理机制讲解清楚,在前面的文章中我们已经提交到Item是Memcached中存储的数据单元,而Item的内存分配策略就是本章的重点了。
Memcached源码分析 - 网络模型(1)Memcached源码分析 - 命令解析(2)Memcached源码分析 - 数据存储(3)Memcached源码分析 - 增删改查操作(4)Memcached源码分析 - 内存存储机制Slabs(5)Memcached源码分析 - LRU淘汰算法(6)Memcached源码分析 - 消息回应(7) 开篇 这篇文章的目的是起到以个承前启后的作用,承前是指命令解析,启后是指数据存储。
Memcached源码分析 - 网络模型(1)Memcached源码分析 - 命令解析(2)Memcached源码分析 - 数据存储(3)Memcached源码分析 - 增删改查操作(4)Memcached源码分析 - 内存存储机制Slabs(5)Memcached源码分析 - LRU淘汰算法(6)Memcached源码分析 - 消息回应(7) 开篇 这篇文章的目的主要是为了讲清楚Memcached内部数据存储结构,以及基于该存储结构的增删改查操作过程。
Memcached源码分析 - 网络模型(1)Memcached源码分析 - 命令解析(2)Memcached源码分析 - 数据存储(3)Memcached源码分析 - 增删改查操作(4)Memcached源码分析 - 内存存储机制Slabs(5)Memcached源码分析 - LRU淘汰算法(6)Memcached源码分析 - 消息回应(7) 开篇 这篇博文的目的主要为了讲清楚Memcached在解析命令的处理逻辑,会穿插一些Memcached的命令行操作。
Memcached源码分析 - 网络模型(1)Memcached源码分析 - 命令解析(2)Memcached源码分析 - 数据存储(3)Memcached源码分析 - 增删改查操作(4)Memcached源码分析 - 内存存储机制Slabs(5)Me...
开篇 这篇文章的目的主要是想讲清楚mapper标签的解析过程,核心目的是想讲清楚/mapper/resultMap、/mapper/sql、select|insert|update|delete 这三大类标签的解析过程,以及生成最终的解析对象并保存到Configuration当中。
开篇 这篇文章是对过去一个星期困扰自己的性能问题排查解决的一个总结,希望对其他人能够有所帮助,也希望在百度或者google的搜索引擎中能够被检索,因为在我解决问题的过程中我也是花了好长时间才找到一个相关的文章,同样我会在 Stack Overflow上发布这个问题,希望能够帮到更多的人。
开篇 这篇文章的主要目的是为了讲清楚Mybatis的整个执行流程,会通过源码、流程图等多个维度进行说明,相关的细节由于涉及面比较广这里暂时先不详细展开。
ZooKeeper管理界面 ZooKeeper真是一个非常实用的开源软件,印象中从我13年开始工作开始就开始接触它,当然这篇文章肯定不是为了描述ZooKeeper的,想了解ZooKeeper的可以仔细看看我的专栏ZooKeeper,这篇文章的目的是为了讲述一下我使用过的ZooKeeper管理工具。
开篇 Hystrix的超时检测本质上通过启动单独线程去检测的,线程的启动的时间刚好就是任务超时的时间,本质上就是这么个简单的逻辑。 Hystrix超时后会抛出一个HystrixTimeoutException的异常。
开篇 对Hystrix耳闻已久,最近刚好想在项目中使用这个神器就顺带研究了一把,很多细节来不及深入研究只能把宏观上的各个概念讲解一下,这个介绍的素材大都来自github上的Hystrix官网。
Hystrix demo 在Hystrix的demo当中,基本上都是下面的这种模式,通过继承HystrixCommand并重新run方法定义一个Hystrix的执行体。
开篇 这是一本值得你多次翻阅的书籍,不管是从书籍的内容来说,还是从译者的翻译水平来说,都是非常完美的一本书。 这是一本让我感觉无从下手的一篇读后感,因为截止目前为止我还只是一个醉心于阅读各种开源代码的个体工程师,我没有团队,更没有团队管理经验,所以我不便发表过多的评论,但是从我个人角度来说,这里面提到的很多观点会让你的职业生涯收益。
开篇 本着尊重原创作者精神,我必须表明这个实现是由组内的同事蜂神实现的,我知识站在前人的肩膀上学习了下具体的实现!!! 致敬原作者的牛逼技术!!! PalDB 介绍 PalDB 写数据过程 PalDB 读数据过程 PalDB 线程安全版本 Pa...
开篇 PalDB 介绍 PalDB 写数据过程 PalDB 读数据过程 PalDB 线程安全版本 PalDB reader的多级缓存 在解释PalDB的读过程之前先解释下为啥PalDB读的性能比较理想,其实PalDB可以理解为有多级缓存: 一级缓存是StorageCache对象,里面是用LinkedHashMap实现的缓存 二级缓存是StorageReader对象,通过mmap实现的文件到内存的映射。
开篇 PalDB 介绍 PalDB 写数据过程 PalDB 读数据过程 PalDB 线程安全版本 PalDB写数据Demo StoreWriter writer = PalDB.createWriter(new File("store.paldb")); writer.put("foo", "bar"); writer.put(1213, new int[] {1, 2, 3}); writer.close(); PalDB写数据流程 PalDB写入过程主要分为2个阶段:kv的写入,PalDB文件的生成。