自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 资源 (6)
  • 收藏
  • 关注

原创 深入理解CountDownLatch之手动实现

最近有人私信博主关于CountDownLatch的源码一些细节,这对于初学者来讲学习CountDownLatch的源码还是比较困难的。为此在看源码时,应该先搞懂该类的用途,在进一步对其源码进行分析,这对看源码的你或许小有帮助,话不多说,为了帮助各位更好理解CountDownLatch是怎么回事,本文提供一个CountDownLatch的简单实现,具体代码如下:import java.util...

2020-01-14 22:28:51 339

原创 时间复杂度为O(1)的LRU算法

 LRU,算法在操作缓存中常常被用到,由于其访问频繁,因此缩小LRU时间复杂度是非常必要的,好的LRU算法的实现能够很好的提高系统的稳定性数据结构中map的访问速度非常快,时间复杂度为O(1),因此在缓存结构中,可以借助map结构,同时由于缓存需要容量满时需要删除操作,并且对于最近被访问的需要重新置于头部,在数据结构中链表能够很好的完成该操作,故缓存结构借助map加链表结构来降低时间复杂度,...

2018-09-19 01:38:59 3916

原创 线程间各种转态的切换,以及等待队列与同步队列的区别

面试的时候曾被问到过线程间状态的转换问题,自己回答的不是太好,故查阅了一些资料来巩固这一片空白,资料参考自微信公众号 java团长。首先线程总共有六种状态,分别是初始,运行,阻塞,等待,超时等待,终止转态。第一种:初始(NEW)指新建一个线程对象如Thread thread = new Thread(()->{});还没有调用其start() 方法。第二种:运行状态(RUNNAB...

2018-09-14 22:18:23 2379 1

原创 阅读AQS及其衍生类Semaphore、CountDownLatch、ReentantLock等源码的感悟

曾今阅读过AQS,Semaphore,CountDownLatch,ReentantLock,等并发包的源码,其中后面三个类都是基于AQS实现的,AQS是同步框架的基石,不同的衍生类可以实现tryAcquireShared(主要共享锁实现)tryReleaseShared(主要共享锁实现)tryAcquire(独占锁实现),tryRelease(独占锁实现),以此来实现不同的并发框架,来满足不同的...

2018-09-10 23:08:54 226

原创 NIO源码分析3.0 之一 模拟netty实现一个简易的NIO框架

前面 https://blog.csdn.net/qq_32459653/article/details/81537669中分析了channelPIpeline 在中执行的流程netty的流程,理解这个是我们理解netty源码的基础,今天我们在做一件事,模拟netty实现一个简易的NIO框架,事实上,这也是netty本质的模型,必要的时候我会添加一些代码注释帮助你们理解 先定义一个boss 接...

2018-08-09 17:35:28 279

原创 利用注解优雅解决Springboot+mybatis多数据配置问题

最近在开发项目中(ORM层用的是mybatis),需要连接多个数据库,这时候就涉及到多数据源使用了。为了优雅的解决此问题,我们可以使用装饰者模式并修改了mybatis的实现源码来优雅的解决此问题 由于代码量有点多,文章篇幅有限,就不在此详细的搬出,具体的代码已放到git 飞机票如下https://github.com/skybluehhx/mulitDataSource.git(现已更新支持注解的...

2019-07-04 23:03:44 250

原创 利用netty+zookeep+mysql 自构消息队列,带你理解消息队列的内幕

重要性: 掌握消息中间件是进件为一个高级工程师的必备技能,然而市场上消息中间件有很多中,诸如rocketMQ,kafka,rabbitMQ等等,各种消息中间件层出不穷,大多数人都知其然不知其所以然,仅仅停留在会用的层次,而没有进行深入的研究,本系列博文,将带领大家深入理解消息中间件,并从无到有,手写出一个名为ExquisiteMQ的消息中间件,其中Exquisite译为精致,小巧的...

2019-04-21 12:14:29 675

原创 SpringMVC之自定义参数解析器(同时支持form提交和json提交)

场景:在重构公司的项目当中(将scalay语言转为java语言),由于历史遗留问题和语言,前端多个页面,对于同一接口有时使用json格式提交,有时使用表单形式提交,项目使用的是前后端分离模式,需要自定义参数解析器。分析:SpringMVC中对json形式和表单形式的参数解析器都有实现,因而不需要我们自己去实现具体参数解析,而是在原有的功能方面进行增强,故此很容易想到可利用java中的装饰器模式...

2019-04-13 23:00:52 3139 2

原创 Lease(租约)以及在GFS文件系统中的作用

 租约的作用:分布式环境中维持缓存的一致性的一种协议传统的解决方案:轮询:即每次读取数据时都先询问服务器数据是否是最新的,如果不是就从服务器传输新数据,这种方法需要每次读取数据时都与服务器通信。问题:每读取数据都需要与服务器确认,服务器负载大回调或称为无效化:由服务器记住有哪些客户端读取了数据,对数据做修改时首先通知所有这些客户端数据已经失效。问题:需要服务器记住所有读取过...

2018-11-24 14:25:35 1826

转载 事务的一致性设计(2阶提交和3阶提交)

 看到一篇关于事务的好文章,里面对2阶提交,3阶提交,柔性事务都讲解的比较好,因为涉及到侵权的原因只能放链接了,不能转载,感兴趣的小伙伴直接去看原文吧 ...

2018-10-13 20:49:58 181

原创 一次tomact启动一直报错的原因

在项目发布到tomcat上请一定要将下面的servlet依赖范围scope 为provided,因为tomcat容器自身已近提供,否则将会报错<!-- servlet --><dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api&l...

2018-10-09 17:17:51 361

原创 简易服务网关的实现

网关服务是单一访问点,并充当多项服务的代理。服务网关启用了跨所有服务的路由转发、过滤和公共处理等。在微服务实践中远不止这点功能,它可以做到统一接入、流量管控、安全防护、业务隔离,权限管理等等等功能。下面是服务网关的大概作用图。  本质来讲服务网关就是在请求来临做一定的处理(如,权限验证,请求转发),从而决定该请求如何进行(如:转发到后台服务,直接拒绝处理),这有点类似spr...

2018-10-06 21:28:36 1157

原创 RateLimiter 源码分析

RateLimiter为guava包下以令牌桶算法抽出来的基类。在这里要说明一下,在令牌桶算法中,理论上是要每隔一定的时间往桶里添加令牌,具体的实现方式有两种第一种:常规实现是采用定时任务,每隔一定的时间往桶里添加令牌 ,该种方式需要额外开启后台线程,消耗资源第二种:(补偿思路) 保存下一次需要添加令牌的时间nextFreeTicketMicros,每次请求时,进行补偿(核对当前时间是否...

2018-10-04 23:38:35 540

原创 简易时间轮的实现

在处理大量的延迟任务的时候jdk自带的延迟定时任务队列在处理延迟任务(如删除,修改)需要logn的复杂度,这并不能满足已有的需求,于是时间轮延迟算法被设计出来,其原理是模仿生活中的时钟,已每过一段时间,移动一格并执行该格中的任务队列,需要放置任务时,只需要放到当前格的前一格即可,待下次(走满一圈)再次走带该位置在执行此任务,此任务延迟的执行的时间就等于每格所代表的时间*总共的格数,关于时间轮算...

2018-10-02 23:22:29 738 2

原创 高并发请求之页面静态化

在高并发请求中(如秒杀系统)需要将请求尽量拦截在上游,减轻下游的压力,常用的在前端的方式有,限定点击次数,检测ip防止脚本式的攻击,页面静态化,后端一般使用消息队列+缓存的形式,一次来最大的拦截无用请求,最小化查询数据库次数,从而减轻服务器压力,达到高并发。今天就实战一下也页面静态化,学习之前请确保会springMVC的基本知识。 什么是页面静态化:我的理解就是对页面进行缓存,当请求来临时,我...

2018-09-25 16:10:35 431

原创 一次开启vmware使用dubbo时(zookeeper注册中心)遇到的问题

楼主在用dubbo时(zookeeper充当注册中心)在服务与消费者都正确配置时,服务提供方启动正常,而在消费者启动时将会报错,具体错误信息如下Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloServ...

2018-09-24 21:31:45 1147

原创 LRU(多线程)缓存的实现

前面写了个lru缓存,适用于单线程的场景。多线程实现缓存的思路有很多种,有基于ttl淘汰策略的,有基于lru淘汰实现的,而在淘汰的方式也有很多选择,如果选用Concurrenthashmap,可以很好的基于ttl淘汰策略,具体实现是另开一个守护线程,定时淘汰ConcurrenthashMap中的过期键,而在使用lru淘汰策略时则需要额外借助辅助结构双向链表,需要额外的同步操作,由于在本文之前实现了...

2018-09-20 14:27:28 2815 1

原创 Spring+SpringMVC+Mybatis整合

首写 引入maven依赖<properties> <!-- spring版本号 --> <spring.version>4.3.0.RELEASE</spring.version> <!-- junit版本号 --> <junit.version>4.12</junit.versio...

2018-09-18 11:18:36 178

原创 生产者与消费者从synchronized到ReentantLock

生产者消费者问题是经典的多线程问题,是工业化生产的模型,今天讲的就是生产者,消费者模型以及如何慢慢的改进,进而变为多消费者,多生产者。首先从简单的开始做起,假设我们只有一个生产者,一个消费者。代码实现如下plate代表着共享区,生产者和消费者可以同时操作共享区,分别生产蛋和消费蛋** * Created by lin on 2018/9/15. */public class Pla...

2018-09-16 20:17:46 209

原创 实现一个固定大小的最小堆

/** * Created by lin on 2018/9/13. */public class Heap { private int length; int size = 0; private Integer[] queue;//初始化堆 public Heap(int length) { this.queue = new Integ...

2018-09-13 22:52:25 995

原创 深度分析kmp算法,从原理到实现(看了必会,简单直观)

kmp算法,常用于匹配一个字符串是否是另一个字符串的子串,不同于暴力搜索kmp算法的时间复杂度为O(m+n),网上好多对于该算法的讲解代码,但发现有木有,几乎所有的代码全是一模一样,根本没几个是自己写的,给的都是书上标准优化后的代码,直接抄下来,理解困难,原理讲解不清,含糊其词,因此本人自写一遍关于kmp算法的博客,并讲解该kmp算法的原理,以及为什么需要next数组,并证明每次最优移动次数就是n...

2018-09-09 15:13:43 6164 1

原创 求一个数中1的个数

碰到遇到一个有趣的题,求一个数二进制的表示中1的个数,该题有两种解法,一种是使用短除法将该数直接转化为二进制数,另一种比较巧妙的算法是使用与运算,原理如下图所示 依照此种思入有如下算法int NumberOf1_Solution3(int i){      int count = 0;      while (i>0)      {            ++ co...

2018-09-06 22:37:28 638

原创 求取数组中倒数 第k大的数

求数组中倒数第k大的数有多种求法,如直接使用堆排序按从小到答案,在遍历数组求取第k个数即可时间复杂度为nlog(n),还有一种较为快速的求法是维持一个最小堆,算法有nlog(n)直接将为nlog(k),当k远远小于n时,该算法将会有很大的优势,本文将介绍该种算法的具体实现, 在具体实现时,需要考虑几个因素,初始堆大小,有我们传入的k的大小决定,默认值我们赋值为 Integer.MAX_VALU...

2018-09-06 13:18:02 788

转载 针对Redis Rehash机制的探索

 最近看到一篇美团大牛写的一篇有关redis的文章,看完之后感觉对redis的认知又加深了很多,因此转发收藏,美团针对Redis Rehash机制的探索和实践春林 赵磊 ·2018-07-27 19:39背景Squirrel(松鼠)是美团技术团队基于Redis Cluster打造的缓存系统。经过不断的迭代研发,目前已形成一整套自动化运维体系:涵盖一键运维集群、细粒度的监控、支持...

2018-09-05 16:45:17 351

原创 深入分析ScheduledThreadPoolExecutor的源码

上篇文章我们讲解了Timer的实现机制,但是Timer定时器是单线程的,如果该线程终止的话,那么定时任务将无法执行,为此jdk1.5后推出了ScheduledThreadPoolExecutor,用于执行定时任务,为此我们在这里就分析一下ScheduledThreadPoolExecutor的具体实现么,因为ScheduledThreadPoolExecutor是基于ThreadPoolExecu...

2018-09-01 17:54:00 238

原创 一篇文章带你详解定时器 Timer 的运行机制

本篇博文基于jdk1.8对Timer定时器进行深入分析,带你详解Timer定时器的原理package java.util;import java.util.Date;import java.util.concurrent.atomic.AtomicInteger;public class Timer {      private final TaskQueue queue = ne...

2018-08-31 09:34:04 1498

原创 Spring之手写Aop(6)

本章将主要讲解Aopsupprot 和JDkDynamicProxy,写到这里这个简易的aop框架也就要结束了,真个项目我也上传地址为https://github.com/skybluehhx/MyAop.git.首先看一下AopSupport的实现package com.support;import com.MethodConfig;import com.ProxyConfig;...

2018-08-30 12:12:08 288

原创 Spring之手写Aop(3)

到了这里也到了一个很重要的部分了,使用aop本质上是对方法使用之前,或之后添加自己的逻辑,而如何具体实现,有Aop联盟就抽象出了方法拦截器,用来执行在方法之前或之后的逻辑,而如何来调用这些拦截器,拦截器的执行顺序如何呢?这有引出了方法调用器(我自己取的, 也就是MethodInvocation)首先来看一下方法拦截器的定义  // Source code recreated f...

2018-08-30 12:11:33 451

原创 Spring之手写Aop(1)

aop,面向切面编程,是面向对象的一种补充,手写之前请确保有一下基础知识,分别为java注解的基本使用,java动态代码,了解spring框架,了解beanPostProcessor的作用,以及掌握java的适配器模式。为了简化开发量,这里借助spring。开发的出的框架遵守aop联盟,实现方法与spring自带的Aop实现方式略有不同,但原理相同在实现方面,另辟道路,通过注解的方式表明 ...

2018-08-30 12:06:19 714

原创 Spring之手写 Aop(4)

上几篇提到分别提到了方法拦截器,和advice等通知,在上面的过程中,框架使用者通过实现MethodBeforeAdvice等接口来来表示在操作某个方法之前或之后应该做什么,而我们的程序中通过方法拦截器来表示在方法之前或之后应该做什么,两者不一样?该如何解决呢? 不错,这时候就需要用到java的设计模式——适配器模式了首先定义适配器接口,明确适配器的功能package com.aut...

2018-08-30 12:02:47 207

原创 Spring之手写Aop(5)

前面我们已经对MethodInterceptor,advice等类给出了介绍,并给出了具体的实现,接下来的问题时框架如何知道用户启动aop换句话说 ,框架如何知道用户能够对方法启动了代理,答案就是注解,这里借助一个beanPostProcessor+java注解(EnableAop,interceptorAdvice前面已经做了介绍,这里不再重复)的方式来实现,利用beanPostProcesso...

2018-08-30 11:51:13 266

原创 Spring之手写Aop(2)

上篇博文中涉及到两个很重要的注解,EnableAop 和InterceptorAdvice  具体的定义如下 package com.annotations;import org.aopalliance.aop.Advice;import java.lang.annotation.ElementType;import java.lang.annotation.Retention...

2018-08-29 19:16:20 178

原创 一篇文章带你了解AQS的原理及流程

本文带你了解jdk1.8版本AQS源码的原理及执行流程,由于AQS源码过长,在这里就不粘贴复制了,自己去jdk看源码就行这里我只讲AQS的主要流程给详解一下(主要是doAcquireShared方法这也是最关键的算法) 为此我画了一个流程图。具体如下  上面流程基本对每个个方法都做了介绍,相信对着上面的介绍在看源码,你肯定会轻松很多,这里就不对上面所提到的方法一 一从jdk...

2018-08-27 13:36:49 1478

原创 java之实现自己的数据库连接池

最近仿mybatis写了一个自己的orm框架 项目已上传到github上 https://github.com/skybluehhx/MYORM.git,既然是orm框架肯定需要事务管理器和数据库连接池,下面将介绍我自己实现一个连接池 (主要借助阻塞队列)首先定义一个接口,给出线程池的基本功能package Pools;import java.sql.Connection;/**...

2018-08-26 18:52:00 2087 1

原创 记录一次配置Netty源码阅读的IDEA环境

前段通过看netty源码都是通过dubug方式,但是由于引入的是maven项目,不能添加注释,这让人很不爽,后来到官网去下载源代码,添加到自己的项目中,那么问题来了,如何引入原本netty项目中所依赖的jar包呢?其实很简单,既然netty是maven项目,那么netty所依赖的jar包应该也是通过maven引入的。下面就让我们来看一下具体的操作步骤,首先去官网下载netty源码,我当初为...

2018-08-21 14:54:16 2616

原创 仿mybatis,手写自己的ORM框架

orm框架,说白了就是帮助用户对jdbc进行封装,底层还是操作jdbc,前几天了解了一下mybatis的原理,于是想手写一个自己的半自动orm框架,加深对orm的使用和理解,顺便记录下自己的学习历程。本篇博客的orm框架开发环境为Spring4.3.0.RELEASE+jdk1.8,基于注解的形式开发,目前提供的功能较为简单,暂未开发出参数转换器,首先介绍对开发中涉及到的注解,做一个简要的介绍...

2018-08-21 11:30:50 1459

原创 使用Aop实现自己的异常处理器

spring的aop中提供了强大的处理机制,今天就利用spring的@Around注解实现自己的异常处理机制,使我们的代码变得更加简洁,避免代码重复使用try catch, 首先定义一个切面,对我们感兴趣的方法尽行拦截package com;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.a...

2018-08-21 11:30:21 553

原创 深度解析CyclicBarrier源码 (全注释版)

CyclicBarrier 相对于CountDownLatch来讲其源码是简单多了,CountDownlatch的使用场景一般是一等多,CyclicBarrier的使用场景为多个线程互相等待,当然对CountDownLatch有兴趣的博友可以看一下我这篇博客对于CountDownlatch源码的分析https://blog.csdn.net/qq_32459653/article/details/...

2018-08-13 20:39:39 714

原创 java.concurrent包之DelayQueue源码分析

延迟队列在java并发包中 其源码来说相对较简单,下面就让我们来分析一下延迟队列的实现,以下是基于jdk1.8实现的DelayQueue的主干代码 package java.util.concurrent;import java.util.concurrent.locks.*;import java.util.*;public class DelayQueue<E e...

2018-08-13 17:39:25 149

原创 nettty3.0之探究FrameDecoder 带你了解解码器的原理

使用过netty的人都知道,在使用netty的时候都或多或少碰到粘包或分包问题,这里就需要使用使用解码器了,那解码器如何工作的呢?现在就带大家探究一下,首次请看下面我画的一张frameDecoder流程图,因为源码就是按照这个思路写的。 带着这个思路,我们就开始我们源码分析之旅吧!!,首先你应该明白,FrameDecoder是一个handler,应为netty中数据交个管道中的hand...

2018-08-11 13:49:24 1435

tomcat6.0 可直接运行源码.zip

供大家一起研究tomcat,tomcat内部所需jar包已补齐,为大家 提供可直接运行的tomcat服务器源码,内部直接导入即可使用

2019-12-25

how tomcat works中英文版

how tomcat works中英文版(中文版名为:深度剖析tomcat),附带源码

2018-12-28

手写简易版ORM框架(仿mybatis)

自己手写的一个半自动框架,里面有运行例子,部分代码从mybatis中抽出

2018-08-21

谷歌浏览器插件postman绿色安版

用来模拟http请求写利器 ,供大家取用,下载后直接添加到谷歌的扩展程序即可

2018-07-19

Spring0.9早期框架

Spring0.9版本 是研究Spring框架思路的有力利器 供大家下载研究。但在研究时 需使用jdk1.4版本左右的后期jdk编译会出错

2018-05-04

JDK1.4老版本

jdk1.4老版本 供大家 在研究一些早期java框架源码的时候使用

2018-05-04

空空如也

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

TA关注的人

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