自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

点滴记录

https://github.com/zhchenme

  • 博客(197)
  • 资源 (3)
  • 收藏
  • 关注

原创 jdk1.8 源码分析导图

以下总结全部基于 jdk1.8。非并发源码幕布地址:https://mubu.com/doc95LpcV0Umt

2019-05-20 15:32:02 831

原创 代码整洁之道

幕布链接:https://share.mubu.com/doc/2qVEGDxoift命名函数

2021-05-27 16:10:42 423

原创 工作上的一些思考

思来想去觉得还是要记录些什么,从一开始工作到现在多多少少还是有点想法。这次主要分享下工作中自己的一些思考与收获。19 年 10 月份加入了现在这家公司,当时公司里并没有 Java 技术栈,所以我们团队需要从零搭建 Java 分布式体系架构。得益于上家公司的技术体系,我们任务模块划分的很清晰,分工也比较明确。因为团队人手问题,每个人都负责不同的业务模块,任务较重。当时自己的情况是刚从实习转正没多久,对于这种大型项目没有什么经验,心理上的压力比较大。现在看来心理压力大的原因主要在于做项目时没有一个完整的规划

2021-05-10 10:06:39 457

原创 业务总结004:检验项目时间轮实践与库存实现方案

2020 年底公司和阿里健康合作了一个检验项目,由我司提供检验项目(商品)、采样点(商户)、库存等底层数据,与阿里健康开发对接后在支付宝平台进行线上预售,开发流程其中也包括订单数据的交互。项目开发期间踩了比较多的坑,做了很多优化,其中也包含一些有意思的技术实现方案。一、时间轮实践某些业务场景下,我们需要频繁调用阿里健康接口,项目第一个版本上线后,发现有部分请求触发阿里健康接口流控告警,原因是他们提供的接口在一定的时间内只允许 N 次接口调用。针对这个问题,想到了以下几种实现方式:sleep 同步调

2021-02-20 11:21:07 481

原创 Netty时间轮调度原理分析,再不了解你就out啦

一、时间轮介绍之前公司内部搭建的延迟队列服务有用到时间轮,但是一直没有了解过它的实现原理。最近有个和支付宝对接的项目,支付宝接口有流量控制,一定的时间内只允许 N 次接口调用,针对一些业务我们需要频繁调用支付宝开放平台接口,如果不对请求做限制,很容易触发流控告警。为了避免这个问题,我们按照一定延迟规则将任务加载进时间轮内,通过时间轮的调度来实现接口异步调用。很多开源框架都实现了时间轮算法,这里以 Netty 为例,看下 Netty 中时间轮是怎么实现的。1.1 快速入门下面是一个 API 使用例

2020-12-25 14:18:56 986

原创 性能远超AtomicLong,LongAdder原理完全解读

高并发场景下可以选择 AtomicLong 原子类进行计数等操作,除了 AtomicLong,在 jdk1.8 中还提供了 LongAdder。PS:AtomicLong 在 jdk1.5 版本提供。AtomicLong 底层使用 Unsafe 的 CAS 实现,当操作失败时,会以自旋的方式重试,直至操作成功。因此在高并发场景下,可能会有很多线程处于重试状态,徒增 CPU 的压力,造成不必要的开销。LongAdder 提供了一个 base 值,当竞争小的情况下 CAS 更新该值,如果 CAS 操作失败,

2020-12-11 16:21:04 947

原创 深入理解 Java 泛型擦除机制

我们都知道 Java 中的泛型可以在编译期对类型检查,避免类型强制转化带来的问题,保证代码的健壮性。不同语言对泛型的支持也不一样,Java 中的泛型类型在编译期会擦除,下面一个例子可以证明这一点: public static void main(String[] args) throws Exception { List<String> list = new ArrayList<>(); list.add("abc"); Class&

2020-08-28 17:01:02 1915

原创 最通俗易懂的短链接原理讲解

看业务代码的时候,有些逻辑用到了短链接服务,感觉还蛮有意思的,这里简单的记录一下。这种营销短信大家应该都收到过,短信有最大字符限制,而且为了更好的观感体验,短信里的链接一般都很短。现成的短链接生成服务也比较多,比如新浪、百度等,谷歌之前也有短链接服务,号称是最快的,但是在 2018 年关闭了。一、短链接原理我们点击短链接会发起一个 GET 方式的 HTTP 请求,当请求到对应的 API 后,会解析短链接里的标识获取到对应的长链接,然后重定向到长链接,这样整个流程就结束了。比如我用新浪的短链接服务

2020-05-13 17:17:25 12838

原创 Spring AOP 源码系列(一)解析 AOP 配置信息

在进行源码阅读之前建议先看一下这篇文章:Spring AOP 源码分析系列文章导读 by 田小波,写的非常好,推荐阅读。关于 AOP 中常用的一些术语这里就不解释了,如果不清楚的建议先看一遍上面推荐的文章。一、AOP 配置入口在分析源码之前,我们先来看一下 XML 中关于 AOP 的配置: <bean id="userServiceImpl" class="com.jas.me...

2020-04-15 19:07:56 482

原创 Spring IoC 源码导读

源码记录:spring-framework-5.1.7-source-code-read文章导读Spring IoC 源码系列(一)BeanDefinition 初始化与注册Spring IoC 源码系列(二)IoC 容器启动流程分析Spring IoC 源码系列(三)Spring 事件发布机制原理分析Spring IoC 源码系列(四)bean创建流程与循环依赖问题分析Spring...

2020-03-27 19:30:48 338

原创 Spring IoC 源码系列(五)getBean 流程分析

一、FactoryBean 用法讲解在分析源码流程之前,我们先来看一下 FactoryBean,乍一看这家伙和 BeanFactory 很像,它们都可以用来获取 bean 对象,简单来说 FactoryBean 是一种可以生产 bean 的 bean,而 FactoryBean 是一个生产 bean 的工厂。下面举个例子来简单说明一下 BeanFactory 的用法: // 定义一个 ...

2020-03-25 20:29:10 620

原创 Spring IoC 源码系列(四)bean创建流程与循环依赖问题分析

创建单例 bean 的代码细节在 org.springframework.beans.factory.support.AbstractBeanFactory#getBean 中,getBean 顾名思义是获取 bean 的流程,如果 bean 不存在的话会先创建,创建前与创建后的具体流程在下一篇文章里进行总结。这里只对创建 bean 的流程进行详细的分析。1.入口在 AbstractBeanF...

2020-03-19 20:46:59 339 1

原创 Web service 介绍与简单应用

一、Web service 介绍1.1什么是Web service到目前为止对Web service 没有统一的定义,这里以一种更容易理解的方式解释。Web service 是一个平台独立的,低耦合的,自包含的、基于可编程的web 的应用程序,即是一种跨编程语言和操作系统平台的远程调用技术。Web service 技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件...

2020-03-16 19:28:04 3798

原创 Spring IoC 源码系列(三)Spring 事件发布机制原理分析

在 IoC 容器启动流程中有一个 finishRefresh 方法,具体实现如下: protected void finishRefresh() { clearResourceCaches(); initLifecycleProcessor(); getLifecycleProcessor().onRefresh(); // 向所有监听 ContextRefreshedEvent...

2020-03-14 19:41:00 467

原创 业务总结003:抽奖活动

一、抽奖活动模型上图是大概的抽奖活动模型,可能一个抽奖活动会持续很多天,这里活动抽奖规则、奖励库存都采用的都是当日的概念,当然也可以采用活动持续时长的概念,具体看产品的意愿,毕竟产品大大说了算。二、抽奖算法2.1 随机概率在奖励池随机一个作为用户奖励,这种方式实现起来很简单,但是产品不允许。为了吸引用户参与抽奖,一般会设置一些成本较高的奖励,这些成本较高的奖励肯定不希望被用户大概率抽到。...

2020-03-14 15:27:25 513

原创 Spring IoC 源码系列(二)IoC 容器启动流程分析

private static final String configLocation = "applicationContext.xml"; @Test public void beanTest() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext(c...

2020-03-13 20:39:50 328

原创 Spring IoC 源码系列(一)BeanDefinition 初始化与注册

一、BeanDefinition1.1 什么是 BeanDefinition在一般的 Spring 项目中,主要通过 XML 的方式配置 bean,而 BeanDefinition 就是 XML 配置属性的载体,XML 文件首先会被转化成 Document 对象,通过解析 Document,把 XML 中 <bean /> 标签转化成 BeanDefinition 供 IoC 容器...

2020-01-19 17:37:19 611

原创 业务总结002:秒杀活动架构设计

一、秒杀商品模型二、架构设计2.1 Redis + MQ缓存预热:秒杀商品一般时效性比较强,一场秒杀活动持续的时间不会很长,当在后台设置秒杀活动添加秒杀商品时,把商品对应的库存直接存到 Redis,但是要注意的是,设置缓存时一定要设置过期时间。削减请求流量:当用户进到秒杀商品详情及后续所有操作都应当进行库存、秒杀资格校验扣减 Redis 库存:当用户从秒杀商品详情到账单页请求下单时...

2019-12-27 17:25:43 570

原创 业务总结001:优惠券与礼包活动

优惠券相信大家在各大电商网站购物的时候都用过,有的时候领了一张券会想法设法的挑选商品来达到优惠券的使用金额,哪怕买了预期之外的商品也要把这张券用掉,褥羊毛的心态大部分人都有。从产品的角度思考类似优惠券这种营销活动正是抓住了用户褥羊毛的心态,促进用户消费来增加商品的销量,从而赚取更多的利益。现在很多类电商产品在你注册之后会时不时的给你发一张券,当你有需求时还是很乐意去 app 上面买东西的。最近...

2019-12-24 16:31:38 1976

原创 lombok @Builder 是如何实现的

lombok 可能大家都用过,有一个 @Builder 注解可以很方便的在对象初始化的时候填充属性值,不用大量的调用 setter 方法,代码更易于阅读与编写。不知道大家有没有想过 @Builder 注解内部是怎么实现的,前些天看 《Effective Java》 的时候刚好看到有一个例子,其实很简单,这里以一个例子分享下代码实现。定义 Builder 接口,用于 build 对象:publi...

2019-09-14 17:36:59 3404

原创 Java8 EnumSet 源码简单分析

一、EnumSet 概述EnumSet 是一个用于存储枚举类型的 set 集合,一般的 set 集合底层都是使用对应的 map 实现的,但 EnumSet 是个特例,它底层使用一个 long 类型的整数或者数组实现。下面我们先来看下它的使用方式:public class EnumSetTest { public static void main(String[] args) {...

2019-07-04 17:35:07 451

原创 Java8 EnumMap 源码分析

一、EnumMap 概述EnumMap 是一个用于存储 key 为枚举类型的 map,底层使用数组实现(K,V 双数组)。下面是其继承结构:public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializable, Clon...

2019-05-02 17:26:13 804

原创 Java8 ThreadLocal 源码分析

一、ThreadLocal 简介在学习源码之前,有一个概念我们需要先明白:ThreadLocal 可以使多线程间数据读写隔离,因此 ThreadLocal 解决的是线程局部变量安全性问题,并不是多线程间共享变量安全性问题。ThreadLocal 在使用时必须先初始化 value,否则会报空指针异常,你可以通过 set 方法与重写 initialValue 方法两种方式初始化 value。下面...

2019-05-01 17:35:03 462

原创 Java 为什么不支持创建泛型化数组

没事的时候在书中翻了下泛型相关的知识,注意到一个比较有意思的问题:Java 不能创建泛型化数组。比如像下面这样就是不允许的:// 创建一个泛型类public class Generic<T> {}// 测试类public class Test { public static void main(String[] args) { // 创建一个泛型化数...

2019-04-30 10:56:22 774

原创 Java8 PriorityBlockingQueue源码分析

在看这篇总结之前,建议大家先熟悉一下 PriorityQueue,这里主要介绍 PriorityBlockingQueue 一些特殊的性质,关于优先级队列的知识不作着重介绍,因为过程与 PriorityQueue 都是一致的。关于 PriorityQueue 的文章,你可以参考这里->点击前往~PriorityBlockingQueue 相关源码分析add 方法 public ...

2019-04-10 18:36:55 493

原创 Java8 IdentityHashMap 源码分析

在讲这个数据结构之前,我们先来看一段代码: public static void main(String[] args) { IdentityHashMap<String, Integer> map = new IdentityHashMap<>(); map.put("Hello " + "World", 1); m...

2019-03-20 20:20:01 780

原创 Redis 数据结构之哈希表

Redis 的字典底层使用哈希表实现,说到哈希表大家应该能联想到 HashMap 或者是 Hashtable,也应该能联想到 key、value 的存储形式,以及哈希表扩容,哈希算法等知识点。那么 Redis 字典是否也是通过这种形式实现的呢?带着这些疑问下面我们就来了解一下 Redis 中的哈希表。一、 哈希表结构table:用于存储键值对size:表示哈希表的数组大小used:表示...

2019-03-15 20:12:53 4800 1

原创 Java8 CountDownLatch 源码分析

一、CountDownLatch 概述1.1 什么是 CountDLatch闭锁(CountDownLatch)是 java.util.concurrent 包下的一种同步工具类。闭锁可以用来确保某些活动直到其他活动都完成后才执行。闭锁相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当达到结束状态时,这扇门会打开,并允许所有的线程通过。1.2 CountD...

2019-03-11 20:14:15 804

原创 Java8 ReentrantLock 源码分析

一、ReentrantLock 概述1.1 ReentrantLock 简介故名思义,ReentrantLock 意为可重入锁,那么什么是可重入锁呢?可重入意为一个持有锁的线程可以对资源重复加锁而不会阻塞。比如下面这样: public synchronized void f1() { f2(); } private synchronized void ...

2019-03-07 20:05:07 635

原创 Java8 CopyOnWriteArrayList 源码分析

一、CopyOnWriteArrayList 概述1.1 概念概述CopyOnWriteArrayList 是 juc 包下一个线程安全的并发容器,底层使用数组实现。CopyOnWrite 顾名思义是写时复制的意思,其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,会把内容 Copy 出去形成一个新的内容然后再进行修改,这是一种延时懒惰策略。假设往一个容器添加元素...

2019-02-15 19:47:26 532

原创 Java8 Hashtable 源码阅读

一、Hashtable 概述Hashtable 底层基于数组与链表实现,通过 synchronized 关键字保证在多线程的环境下仍然可以正常使用。虽然在多线程环境下有了更好的替代者 ConcurrentHashMap,但是作为一个面试中高频的知识点,我们还是有必要了解一下其内部实现细节的。1.1 内部属性 // 内部数组 private transient Entry&amp;amp;amp;amp;amp;amp;amp;lt...

2019-01-24 15:02:08 806

原创 Java8 ArrayBlockingQueue 源码阅读

一、什么是 ArrayBlockingQueueArrayBlockingQueue 是 GUC(java.util.concurrent) 包下的一个线程安全的阻塞队列,底层使用数组实现。除了线程安全这个特性,ArrayBlockingQueue 还有其他的特点:当队列已满时,会阻塞后面添加元素 [put(E e)] 的线程,直到调用了移除元素的方法队列不满的情况下会唤醒前面添加元素的线...

2019-01-21 15:47:01 570

原创 Java8 LinkedHashMap 源码阅读

如果你对 HashMap 的源码有了解的话,只需要一图就能知道 LinkedHashMap 的原理了,但是具体的实现细节还是需要去读一下源码。一、LinkedHashMap 简介1.1 继承结构从继承结构上来讲 LinkedHashMap 继承自 HashMap,LinkedHashMap 中没有提供任何增删改查的方法,而是直接复用了父类 HashMap 中的方法。1.2 内部数据结构...

2018-12-31 16:30:43 700

原创 Java8 PriorityQueue 源码阅读

一、什么是 PriorityQueue这篇文章带大家去了解一个 jdk 中不常用的数据结构 PriorityQueue(优先队列),虽然在项目里用的不多,但是它本身的设计实现还是很值得大家看一看的。PriorityQueue 底层是一个用数组实现的完全二叉树,但它并不只是一个完全二叉树,在没有自定义比较器(自然排序)的情况下,更严格的来讲它是一个基于数组实现的小顶堆(父节点的元素值小于左右孩子...

2018-12-20 22:26:03 816 7

原创 Java8 HashMap 扩容机制与线程安全分析

如果大家有仔细阅读过 HashMap 的源码就会发现 HashMap 的哈希表初始化并不是在其构造函数中进行的,而是 resize() 方法。这篇文章不对 HashMap 中的树进行介绍。一、HashMap 四个构造函数这里把 HashMap 的四个构造函数全贴出来,主要是给大家一个参照。PS:并不是所有的构造函数都初始化了 threshold,但是所有的构造函数都初始化了加载因子,另外初...

2018-12-17 21:19:27 3479

原创 Redis 数据持久化之 RDB

我们知道 Redis 是内存数据库,它将自己的数据存储在内存中,如果它不想办法将数据存入磁盘中,那么当服务器进程退出或意外宕掉的时候,服务器中的数据也会消失。为了解决这个问题, Redis 提供了 RDB 与 AOF 两种数据持久化方式,将数据存储到磁盘中,避免数据丢失。AOF 持久化不在本篇文章讨论范围内,如果大家感兴趣可以关注后面的总结文章。一、RDB 介绍RDB(Redis Dat...

2018-11-13 21:10:54 594

原创 《Redis 设计与实现》读书笔记-Redis 对象

一、Redis 对象1.1 Redis 对象简介Redis 使用对象来表示数据库中键和值,当我们在数据库中存储一个键值对时,至少会创建两个对象,一个对象用于存储键值对的键,另一个对象用于存储键值对的值。Redis 中的每一个对象都由一个 RedisObject 结构表示,该结构有三个属性和保存的数据有关,分别是 type 属性、encoding 属性和 ptr 属性。typedef str...

2018-10-28 15:07:30 360

原创 static 关键字静态导包

我们知道 Java 中的 static 关键字表示静态,可以用于修饰字段、方法、代码块、类(静态内部类)。但是除了这些作用外,还有一个就是静态导包。静态导包是 jdk1.5 提供的一种新的机制,使用方式为 import static packageName.className.* 或 import static packageName.className.methodName,其中 * 表示导类...

2018-09-30 11:12:57 1426 1

原创 HTTP 协议 Host 请求头的作用

host 是 HTTP 1.1 协议中新增的一个请求头,主要用来实现虚拟主机技术。虚拟主机(virtual hosting)即共享主机(shared web hosting),利用虚拟技术把一台完整的服务器分成若干个主机,因此可以在单一主机上运行多个网站或服务。举个栗子,有一台 ip 地址为 61.135.169.125 的服务器,在这台服务器上部署着谷歌、百度、淘宝的网站。为什么我们访问 h...

2018-09-25 19:47:00 38747 2

原创 Java 并发编程系列之带你了解多线程

早期的计算机不包含操作系统,它们从头到尾执行一个程序,这个程序可以访问计算机中的所有资源。在这种情况下,每次都只能运行一个程序,对于昂贵的计算机资源来说是一种严重的浪费。操作系统出现后,计算机可以运行多个程序,不同的程序在单独的进程中运行。操作系统负责为各个独立的进程分配各种资源。并且不同的进程间可以通过一些通信机制来交换数据,比如:套接字、信号处理器、共享内存、信号量等。一、了解多线程1....

2018-09-19 14:44:15 311

基于ssm与websocket的聊天项目

前端技术:Jquery、BootStrap、Ajax、WebSocket、HTML5Canvas、HTML5桌面通知、Amaze UI框架 后端技术:Spring 、 SpringMVC 、 MyBatis 、Shiro 、Jsp 服务器:Tomcat7 数据库:MySql 开发工具:Eclipse 项目管理工具:Maven

2018-03-29

Lucene简单使用需要的jar

Lucene 创建索引与搜索的简单应用,包含了测试所需要的jar 包。

2018-03-06

Lucene 测试需要的jar 包

Lucene 创建索引与搜索的简单应用,包含了测试所需要的jar 包。

2018-03-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除