摘要: 1. 引子ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强。我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必... 阅读全文
posted @ 2018-07-02 23:45 john8169 阅读(1751) 评论(0) 推荐(0) 编辑
摘要: 0. 简介在此声明,B-Tree最正确的翻译应该为B树,而不是B-树,也即并没有B-树的说法,二叉树叫Binary Tree,二叉搜索树叫Binary Search Tree(BST)B树叫Balance Tree,简写为B-Tree (注意是这两个单词连起... 阅读全文
posted @ 2018-06-28 00:01 john8169 阅读(645) 评论(0) 推荐(0) 编辑
摘要: 1. 缓存穿透1.1 什么是缓存穿透?一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大, 就会对后端系统造成很大的压力。这就叫做缓存... 阅读全文
posted @ 2018-06-27 23:57 john8169 阅读(107) 评论(0) 推荐(0) 编辑
摘要: 1. 引子在高并发系统开发时有时候需要进行接口保护,防止高并发的情况把系统搞崩,因此需要对一个查询接口进行限流,主要的目的就是限制单位时间内请求此查询的次数,例如 1000 次,来保护接口。2. 计数器 AtomicLong可以使用Java中的AtomicL... 阅读全文
posted @ 2018-06-27 23:43 john8169 阅读(4154) 评论(0) 推荐(0) 编辑
摘要: 1. 线程不安全的HashMap本节的代码均基于JDK 1.7.0_67HashMap是非线程安全的,HashMap的线程不安全主要体现在resize时的死循环及使用迭代器时的fast-fail上。1.1 HashMap工作原理1.1.1 HashMap寻址... 阅读全文
posted @ 2018-06-27 00:00 john8169 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 1. 摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等(8的ConcurrentHashMap也引入的红黑树)。 本文结合JDK1.7和... 阅读全文
posted @ 2018-06-26 23:55 john8169 阅读(202) 评论(0) 推荐(0) 编辑
摘要: Java 内存模型由于 ConcurrentHashMap 是建立在 Java 内存模型基础上的,为了更好的理解 ConcurrentHashMap,让我们首先来了解一下 Java 的内存模型。下面我们将分别介绍 Java 内存模型的重排序,内存可见性和 h... 阅读全文
posted @ 2018-06-25 23:46 john8169 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 1. 简介最近出了个故障,排查的时候耗费了很长的时间,回顾整个排查过程,经验主义在这里起了不好的作用,直接导致了整个故障排查的时间非常长,这个故障的根本原因在于BlockingQueue用的有问题,顺带展开说说Java中常用的几个BlockingQueue:... 阅读全文
posted @ 2018-06-25 23:39 john8169 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 一. 简介和优劣1.Google的GsonGson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。Gson的应用主要为toJson与fr... 阅读全文
posted @ 2018-06-21 23:35 john8169 阅读(3188) 评论(0) 推荐(0) 编辑
摘要: 1 引子public static void main(String[] args) { String[] sArray = {"a", "b", "c", "d", "e"}; List sList = Arrays.asList(sArray... 阅读全文
posted @ 2018-06-21 23:34 john8169 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次... 阅读全文
posted @ 2018-06-21 23:33 john8169 阅读(99) 评论(0) 推荐(0) 编辑
摘要: InheritableThreadLocal是ThreadLocal的子类。该类扩展了 ThreadLocal,为子线程提供从父线程那里继承的值:在创建子线程时,子线程会接收所有可继承的线程局部变量的初始值,以获得父线程所具有的值。通常,子线程的值与父线程的... 阅读全文
posted @ 2018-06-17 12:44 john8169 阅读(376) 评论(0) 推荐(0) 编辑
摘要: 一、为什么要使用分布式锁为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。但是,随着业务发展的需要,... 阅读全文
posted @ 2018-06-17 12:30 john8169 阅读(229) 评论(0) 推荐(0) 编辑
摘要: Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每个节点中增加了向前的指 针,在插入、删除、查... 阅读全文
posted @ 2018-06-17 12:28 john8169 阅读(269) 评论(0) 推荐(0) 编辑
摘要: chapter1:InnoDB采用MVCC来支持高并发,默认级别是REPEATABLE READ,并且通过间隙锁策略防止幻读的出现,间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定以防止幻影行的插入;InnoDB也支持通过特定的语句进... 阅读全文
posted @ 2018-06-17 12:26 john8169 阅读(265) 评论(0) 推荐(0) 编辑
摘要: Apache RocketMQ之所以能在众多的消息中间件中脱颖而出,能吸引数千企业用户与RocketMQ的关键特性是分不开的,本文详细介绍RocketMQ中的关键特性。一、过万的单机队列数诸如Kafka之类的消息中间件,在队列数上升时性能会产生巨大的损失,R... 阅读全文
posted @ 2018-06-16 10:03 john8169 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 利用java8新特性,可以用简洁高效的代码来实现一些数据处理。定义1个Apple对象:public class Apple { private Integer id; private String name; private BigDeci... 阅读全文
posted @ 2018-06-16 10:00 john8169 阅读(1189) 评论(0) 推荐(0) 编辑
摘要: 1、概述首先,让我们先定义一个简单的实体类:@Datapublic class Human { private String name; private int age; public Human() { super(); ... 阅读全文
posted @ 2018-06-16 09:58 john8169 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.cla... 阅读全文
posted @ 2017-05-08 23:09 john8169 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面... 阅读全文
posted @ 2017-04-09 08:43 john8169 阅读(111) 评论(0) 推荐(0) 编辑