自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zchen

轻度代码洁癖

原创 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 94

原创 jdk1.8 源码分析导图

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

2019-05-20 15:32:02 373

原创 设计模式总结

(一)设计模式参考目录 策略模式 观察者模式 装饰者模式 工厂模式 单例模式 命令模式 适配器模式 外观模式 模板方法模式 迭代器模式 组合模式 状态模式 JDK动态代理 相关设计模式的所有代码,都传到了GitHub,有需要的可以点击前往: https://github.com/coderjas/Design...

2018-02-02 11:50:43 589

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

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

2020-05-13 17:17:25 206

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

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

2020-04-15 19:07:56 172

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

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

2020-03-25 20:29:10 184

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

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

2020-03-19 20:46:59 89

原创 Web service 介绍与简单应用

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

2020-03-16 19:28:04 1357

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

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

2020-03-14 19:41:00 112

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

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

2020-03-14 15:27:25 91

原创 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 65

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

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

2020-01-19 17:37:19 130

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

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

2019-12-27 17:25:43 217

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

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

2019-12-24 16:31:38 346

原创 lombok @Builder 是如何实现的

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

2019-09-14 17:36:59 705

原创 Java8 EnumSet 源码简单分析

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

2019-07-04 17:35:07 136

原创 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 374

原创 Java8 ThreadLocal 源码分析

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

2019-05-01 17:35:03 237

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

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

2019-04-30 10:56:22 242

原创 Java8 PriorityBlockingQueue源码分析

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

2019-04-10 18:36:55 236

原创 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 312

原创 Redis 数据结构之哈希表

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

2019-03-15 20:12:53 1599

原创 Java8 CountDownLatch 源码分析

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

2019-03-11 20:14:15 436

原创 Java8 ReentrantLock 源码分析

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

2019-03-07 20:05:07 331

原创 Java8 CopyOnWriteArrayList 源码分析

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

2019-02-15 19:47:26 235

原创 Java8 Hashtable 源码阅读

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

2019-01-24 15:02:08 452

原创 Java8 ArrayBlockingQueue 源码阅读

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

2019-01-21 15:47:01 270

原创 Java8 LinkedHashMap 源码阅读

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

2018-12-31 16:30:43 442

原创 Java8 PriorityQueue 源码阅读

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

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

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

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

2018-12-17 21:19:27 1853

原创 Redis 数据持久化之 RDB

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

2018-11-13 21:10:54 325

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

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

2018-10-28 15:07:30 206

原创 static 关键字静态导包

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

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

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

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

2018-09-25 19:47:00 17571 1

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

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

2018-09-19 14:44:15 170

原创 Java 并发编程系列之闭锁(CountDownLatch)

在讲闭锁之前,我们先来思考一个问题:在多线程环境下,主线程打印一句话,如何保证这句话最后(其他线程全部执行完毕)打印?博主目前可以想到的实现方式有两种。一种是通过 join() 方法实现,另一种就是用闭锁。如果大家有好的解决办法,可以在下面留言,下面进入正题。一、什么是闭锁闭锁(CountDownLatch)是 java.util.concurrent 包下的一种同步工具类。闭锁可以用...

2018-09-14 17:57:16 1680

原创 Spring Boot 日志管理

在代码有问题的时候,很多人应该都是通过 debug 的方式去排查,往往忽略了日志的重要性。好的日志管理可以快速定位问题出现的位置,也可以提高代码的阅读性。这篇博文主要介绍一下 Spring Boot 中关于日志方面的知识。一、Logging 介绍Spring Boot 为 Java Util Logging,Log4J2 和 Logback 提供了默认配置。每个日志框架,都默认配置了控...

2018-08-28 19:25:29 7190 1

原创 String 对象内存分配策略

这个问题可以说是一个高频的面试题目,以前把这个问题弄懂了,最近突然想到这个问题,一时间竟然没有太好的思路了。所以花些时间整理一下其中的知识点。一、内存分配策略我们先来看一个题目(这个问题都快看吐了~),你知道正确的运行结果并给出解释吗。不知道也没关系,我会在下面给出具体的分析。 @Test public void test() { String s1 = "ab...

2018-08-23 18:19:42 1094 1

原创 Chrome 访问一次 Controller,请求却执行两次

写了一个 Spring Boot 整合 MyBatis Plus 的 demo,相应的配置了 SQL 性能分析插件。当所有代码都写好,访问控制器的时候,发现每发送一个请求,控制台都会输出两次同样的 SQL 分析日志。 没有配置任何拦截器,于是换了个浏览器访问,并没有出现这个问题,上网查了一下才知道是 Chrome 的 JSONView 插件搞的鬼。只要更改一下 JSONView ...

2018-08-22 17:26:56 3829 1

原创 深入理解 HTTPS

一、HTTP 协议的缺点通信时使用明文,内容可能会被窃取:HTTP 本身没有加密功能,无法对通信内容进行加密,只能以明文的方式发送。窃取通信的内容并非一件难事,只需收集在互联网上流动的数据包(帧)就行了。对于收集来的数据包可以使用抓包工具(Wireshark)或者嗅探工具(Sniffer)进行解析。不验证通信方的身份,身份可能会被伪装:使用 HTTP 通信时,由于不需要确认通信方的身份,任...

2018-08-19 17:48:09 380

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