- 博客(31)
- 收藏
- 关注
原创 java令牌桶
public class RateLimit { private long bucketSize; private double currentNum; private double rate; // 最后一次加水时间 private long lastTime; private Lock lock; public static RateLimit create(long ticketPerSecond) { RateLimit r.
2022-02-03 10:25:51 570
转载 java nio Files类使用(转载)
Java NIO中的Files类(java.nio.file.Files)提供了多种操作文件系统中文件的方法。Files.exists()Files.exits()方法用来检查给定的Path在文件系统中是否存在。 在文件系统中创建一个原本不存在的Payh是可行的。例如,你想新建一个目录,那么闲创建对应的Path实例,然后创建目录。由于Path实例可能指向文件系统中的不存在的路径,所以需要用Files.exists()来确认。下面是一个使用Files.exists()的示例:Path p
2020-09-22 00:48:16 528
原创 堆排序
public class HeapSort { public static void main(String[] args) { int[] arr = new int[]{5, 4, 9, 8, 7, 6, 0, 1, 3, 2}; /* * 堆排序必须要先把数组变成堆结构,这样收尾交换后,只有头结点不符合堆结构,调整头结点和交换后的那个子节点树即可 * 这里由最后一个非叶子节点向上排 */ .
2020-08-22 10:06:26 124
原创 mybatis-spring源码分析(有图解)
springboot所有的中间件配置都是从 xxxAutoConfiguration开始的。mybatis也不例外。MybatisAutoConfiguration最重要的3个方法接下来按照执行顺序,逐一讲解一、MapperScannerRegistrarNotFoundConfiguration这个类不一定会执行,主要取决于1、那么这个bean什么时候会有,什么时候会没有呢?这取决于你用什么方式扫描方式。我们通常有2种方式声明mapper: ①在启动类添加@Mappe..
2020-07-24 19:04:33 583
原创 lambda表达式中使用函数式接口
函数式接口:lambda表达式调用函数式接口有如下几种方法:一、匿名内部类二、-> 方式没有参数时候可以使用 () -> {},当参数只有一个时候()可以省略,当处理了只有一行时候{}可以省略三、:: 方式①类名::静态方法②对象::普通方法③类名::new④类名::普通方法这个最特殊!第一个特殊点,其他调用时候参数个数必须一致,但是这个参数要比定义的接口少一个才可以。这句话比较绕,看例子第二个特殊点,如果加上泛型
2020-07-20 22:54:22 481
原创 lombok的@EqualsAndHashcode注解
有时候我们在实体类上面会使用@Data注解,这个注解带了@EqualsAndHashcode注解。一、用法①of 用来指明你要用什么字段来重写equals和hashcode(具体怎么重写看下文)②callSuper 这个选项只能用在有父类情况下,如上图如果没有People那么会报错。这个选项意思就是是否包含父类属性。默认是false那么上文中这样设置,new了2个user,不管是equals还是hashcode那么他们都说是一样的二、lombok是怎么重写equals和hashcod
2020-05-22 18:39:43 7011
原创 nextkey-lock出现条件
Next-key lock行锁 + gap锁。1、没有设置索引或者没有命中索引,全表锁(x锁 + gap锁)2、命中非唯一索引,gap锁3、命中唯一索引,x锁
2020-04-28 17:08:00 380
原创 springbean生命周期以及循环依赖
生命周期注:这篇博文不会每一个方法都细讲,因为主要要说的是生命周期和循环依赖,与这2个主脉络无关的会直接过。一、先扫描包,把类封装成一个beandefinition并且放到beandefinationMap和beandefinitionName里,这一步是在refresh方法的第五步完成的。我看很多博客写生命周期直接从refresh的第十一步开始,但是我觉得beandefinition也算...
2020-02-06 18:44:31 527
原创 springboot Log4jLoggerFactory StackOverflowError
springboot启动时候有可能会报log4j的栈溢出,目前很多网站上面的回答都是具体冲突是log4j-slf4j-impl-2.10.0.jar和log4j-to-slf4j-2.10.0.jar,然后给出的方案如下:<dependency> <groupId>org.springframework.boot</groupId>...
2020-02-04 12:47:14 1354
原创 JVM相关——内存模型以及GC
一、jvm内存模型(注意与JMM——java内存模型区别)在1.7和1.8有了些许改变盗了一张图(1.8)原来的永久代消息,取而代之是元数据区,元数据区也是方法区的一个实现。从目前多方面资料看下来,jvm内存模型还是分为2大块,一个是运行时数据区分为堆、栈、本地栈、计数器,另一个是本地内存(native memry)分为元数据区和直接内存。元数据区没有大小限制,最大就是你物理内存大...
2020-01-30 22:48:20 151
原创 强软弱虚引用以及threadlocal
又是一个被讲烂的东西,但是我还是总结一下,日后也可以自己看。一、强引用A a = new A(); a是强引用,new A();是对象。我们99%都是用这样形式,不多说,不举例。二、软引用软引用是说当内存不足时,也就是快oom之前,它会去把只有软引用引用的对象删除。例子如下:结果如下:三、弱引用弱引用是说当第一次GC时候,删除只有弱引用引用的对象。例子如下:...
2020-01-29 16:59:09 574
原创 Springboot启动原理(一)
第一节讲@SpringBootApplication注解一、@SpringBootConfiguration就一个@configuration注解二、@EnableAutoConfiguration①@AutoConfigurationPackage 先看这个注解,就Import一个类(import作用就是把指定的类加到容器中去)AutoConfigurati...
2019-11-01 16:00:10 145
原创 java实现lru
网上说了很多linkhashmap的实现,但是我觉得还是不要用jdk的工具,自己用最原始的方式实现才更有利于理解。public class Lru { private static final int MAX_NUM = 3; //用来记录节点,使得遍历链表复杂度降低到O(1) private static ConcurrentHashMap<String, L...
2019-10-28 14:29:24 102
原创 spring拓展执行时机
这是一个被人讲烂了的东西,但是我还是会更全面地介绍,并且提出一些坑一、整体流程①BeanFactoryPostProcessor(这个严格来说不是bean生命周期,只是他会在容器初始化完会调用,这里提及,主要为了说明集中后置处理器顺序)②bean实例化(调用构造方法进行实例化,放进三级缓存)③依赖注入④调用各类aware接口(aware接口作用:就是让实现接口的类可以获取容器里...
2019-10-10 14:28:57 278 2
原创 Springboot启动原理(二)
一、启动方法二、进入run方法,跟踪下去发现他先调用一个初始化方法initialize①sources 就是你的启动对象②deduceWebEnvironment()判断是否是web环境,原理就是判断如下的两个类是否存在,存在就是web环境③getSpringFactoriesInstances方法在springboot里大量使用,他的作用是从spring的autoco...
2019-09-18 17:43:07 154
原创 maven子项目打包报错
一、现象父级打包可以,用idea工具deploy可以,但是在terminal deploy子项目会报401二、命令mvn clean javadoc:jar source:jar deploy -pl parent/child -am -Ddoclint=none -Dmaven.test.skip=truejavadoc:jar 打包注释source:jar 打包源码-p...
2019-09-04 14:55:44 436
原创 redis&zk分布式锁
本文主要介绍redis分布式锁,要点1、删除时确认锁防止超时误删除锁 2、锁的续签看代码吧public class RedisLock { private static String lockkey = "defalut-lock-key"; private static long locktimeSecond = 30; private static Concu...
2019-08-20 18:11:04 175 1
原创 transmittable-thread-local解析
这玩意我第一次用到是在用springcloud时候,有组员跟我说希望可以用线程池异步执行。本来没啥问题,但是我们希望模块之间传递traceId(方便日志查询),我们做法是把traceid放在threadlocal里,然后feign请求时候再取出来带到下一个模块去,然后就出现问题了,最后用transmittable-thread-local解决了。一、源码解析点开TransmittableT...
2019-08-09 18:34:40 1405
原创 Guava Ratelimit源码分析以及仿造优化版本
今天介绍Guava的限流RateLimit,主要介绍2个,一个是源码分析,一个是仿造他的原理写一个优化版本。一、源码分析首先我个人认为RateLimit的设计思想很好很优秀,但是写的有点瑕疵,后面我会说到。①create方法第一个参数是Guava的秒表工具用来计时的,第二个参数是你输入的,也就是每秒生成的令牌数。SmoothBursty是RateLimit的子类,看看他的构造方...
2019-07-30 16:56:53 266
原创 synchronized和lock全面详细讲解
synchronized和lock应该是最常用的锁,今天讲这2个原理和比较。我不粘贴也不摘抄,完全是按我自己理解来说,努力做到大白话。一、synchronized原理说原理之前先说synchronized4个状态,因为不同状态的实现原理不同。锁的状态分为无锁->偏向锁->轻量级锁->重量级锁①无锁状态初始化时候状态②偏向锁当只有一个线程进入synchron...
2019-07-19 16:14:31 555
原创 UnsupportedOperationException异常分析
直接先说结论:1不会报错,2、3都会报UnsupportedOperationException错源码分析:①先看看ArrayList的add方法的原理看上去很简单,就是数组赋值,但是注意这个ArrayList的包名:java.util.ArrayList(这个就是引发问题的核心区别)②再看看singletonLIst的add方法原理实例化singletonLI...
2019-07-11 12:11:48 501
原创 阿里sentinel分析
一、这是什么?可以做什么?sentinel可以对接口、系统提供限流,熔断降级,系统保护等功能的一个工具。二、跟网关、hystrix区别网关区别:网关虽然也可以做到限流,但是只是做到client到server的限流,我们服务一般是由一条链路组成,链路之间无法限流,也无法做到熔断等功能。hystrix区别:没啥区别,真要看区别可以百度去。不过我之前使用刺猬感觉就一点不如sentinel...
2019-04-07 19:15:13 1809 1
原创 zuul源码解析
zuul——springcloud的网关。如果看过我之前的博客,可以知道feign的坑是比较多的,但是网关这块做的是比较好的,不管是性能还是灵活性。一、网关的作用: ①路由 ②利用filter可以实现限流(也可以使用ratelimit),鉴权,验签,黑白名单,对请求处理等等。二、zuul源码及其工作流程:我们首先从开启网关注解进行跟踪——@EnableZ...
2018-10-06 16:46:20 615
原创 Feign源码解析
首先我要说的是springcloud没有rpc,这就涉及rpc和微服务的区别。springcloud的模块通信工具feign跟httpclient和okhttp是一样的东西,都是对http请求封装的工具,其实feign可以选择httpclient或者okhttp作为底层实现(修改配置即可)。一、Feign的作用: ①封装http请求,使开发人员对发送请求的过程无感知,给人一种伪...
2018-10-04 17:16:12 2209
原创 ThreadLocal和InheritableThreadLocal解析
一、两者区别: ThreadLocal:为每一个线程创建一个副本,每个副本线程隔离。但是他不支持继承。 InheritableThreadLocal:支持继承。这里的继承不是extends,是指线程的继承。也就是说新起一个线程可以拥有老线程的数据。二、原理: 这里要先说另一个概念ThreadLocalMap。他和普通map差不多,也是key-value结构,key为threadl...
2018-07-05 14:57:35 1390
原创 Eureka源码解析与配置
Eureka只要分为2部分,一个server,一个是client(包含生产者和消费者)。 Eureka client: ①DiscoveryClient接口定义了发现服务的方法,EurekaDiscoveryClient是它的实现。EurekaDiscoveryClient引用EurekaClient接口,DiscoveryClient类是EurekaClient实现。 ...
2018-07-01 16:54:23 866
原创 携程apollo配置中心介绍及安装
分布式配置中心有很多,springcloud的config、百度的disconfig、携程的apollo、淘宝的diamond。由于携程的apollo极少的侵入性,以及面对springcloud开发,所以我项目技术选型最终定为apollo。 一、携程apollo优点: ①支持配置热更新,而且不需要想springcloud那样需要消息总线来回调通知。 ②对于接入项目,只需要引cl...
2018-03-16 16:59:04 9567 1
原创 封装springboot基础框架(含demo)
写此篇博文目的有2个: 一、我想做一个最小化框架,包括配置、拦截器,工具包等等都一应具备,使开发可以直接开始编写业务代码,所以我的demo的名字叫做springboot-base。 二、这也是为了以后介绍springcloud做的一个铺垫。 该框架所有设置均来自本人工作实际开发经验总结出来的。好,废话不多说,我们开始吧!一、springboot介绍 ...
2018-03-16 15:04:28 2760
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人