自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zlj1217的博客

慢慢加油

  • 博客(137)
  • 收藏
  • 关注

原创 dubbo2.7时间轮的应用

dubbo内部有比较多定时任务的管理功能,JDK也提供了Timer和DelayedQueue等工具类,可以实现简单的定时任务管理,其底层实现就是使用的堆这种数据结构,存取的时间复杂度是O(nlogN),无法支持大量的定时任务。dubbo内部采用了时间轮的方式来管理定时任务。应用场景比如:dubbo的心跳机制、dubbo客户端超时检测等。时间轮是一种高效的、批量管理的定时任务的调度模型。时间轮一般会实现一个环形结构,类似于时钟,分为很多槽,每个槽代表一个时间间隔,每个槽使用双向链表来存储定时任务;指针周期性地

2022-07-01 06:14:12 808 1

原创 生产者和消费者模型

基于synchronized的生产者/消费者模型其原理就是通过在获取到锁的wait/notify来实现的线程通信。@SuppressWarnings("all")public class ProviderConsumerWithSync { private Queue<Integer> queue = new LinkedList<>(); public static void main(String[] args) { ProviderCo

2021-07-23 12:26:06 235 1

原创 Lock接口使用及和synchronized的区别

关于锁的一些知识可重入锁如果锁具有可重入性,则称为可重入锁。synchronized和ReentrantLock都是可重入锁。其实可重入锁实际上表明了锁的分配机制:是基于线程的分配还是基于方法调用的分配。比如代码:class MyClass { public synchronized void method1() { method2(); } public synchronized void method2() {

2021-07-22 20:12:33 399

原创 guava中的RateLimiter限流器

限流器基本使用对其中api的基本使用: public static void main(String[] args) {// testSmoothBursty();// testSmoothBursty2();// testSmoothBursty3(); testSmoothWarmingUp(); } static void testSmoothBursty() { RateLimiter ra

2021-07-21 14:16:40 346 2

原创 ArrayList拾遗

1.ArrayList简介ArrayList底层是object数组,容量能在添加元素的过程中动态扩容。并且在可预知添加大量元素时,调用ensureCapactiy方法提前扩容,减少递增式的扩容次数。实现了RandomAccess接口,表示可以快速随机访问。根据下标访问。实现了Cloneable接口,覆盖了函数克隆,不过也是潜拷贝实现了Serializable接口,支持序列化进行传输和Vector容器的区别两者都是List接口的实现类,但是ArrayList线程不安全,Vec

2021-07-20 01:04:44 91

原创 @Async注解和循环引用的启动容器报错问题

现象及相关引用博客https://segmentfault.com/a/1190000021217176问题Spring其实是可以帮助解决循环依赖的,但是在循环依赖的两个bean上有一个加入了@Async注解之后,在启动的时候就报错不能进行循环依赖。@Componentpublic class A { @Autowired private B b; @Async public void testA() { System.out.println(T

2021-07-18 22:49:19 349

原创 dubbo spi原理和源码记录

dubbo的spi概述采用spi是为了更好的达到OCP原则(对扩展开放,对修改封闭)。dubbo采用微内核+插件的架构。内核部分功能稳定,面向功能的可拓展性实现都是由插件来完成的,内核只是管理插件和应用插件实现。这样更灵活。dubbo就是采用spi来加载插件的。SPI原理jdk中的spi使用需要在resource目录下的META-INFO/services下新建对应SPI接口名称为名字的文件,然后将实现类的全限类名作为文件内容。其文件内容:然后利用ServiceLoader接口去加载和使

2021-07-14 19:36:41 116

原创 dubbo filter执行顺序的理解

理解dubbofilter的执行顺序https://blog.csdn.net/donlian/article/details/84719823对dubbo filter执行顺序可以看下这篇。背景在处理网关泛化调用的异常时,需要在provider端将可读异常的message返回给调用方,方便展示。现有工程中有处理异常的filter:@Activate(group = Constants.PROVIDER, order=Integer.MIN_VALUE) @Slf4jpublic class

2021-03-29 23:28:29 1707

原创 orika1.5.1版本的map死循环问题

问题现象在测试环境看到机器cpu报警,且cpu是突然升起来并且一直稳定跑满在百分之90左右。观察流量和接口的qps,并没有突然增加或者有突刺。问题排查上机器top -H -p pid + jstack观察之后发现很多http线程卡在orika的一个weakHashMap的get方法中:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L1YgzDzP-1590335021764)(https://zlj1217-blog-image.oss-cn-hongkong.ali

2020-05-24 23:44:26 383

原创 dubbofilter的spi文件路径问题

自定义dubbofilter在使用dubbo框架的时候可以使用filter去实现一些拦截功能和调整拦截顺序,在每次调用的过程中,Filter的拦截都会被执行。当然除了Dubbo默认的filter,用户也可以自定义dubbo filter来实现对应的功能。这里记录一个遇到的spi文件路径问题。问题现象在测试自定义一个dubbo filter之后,发现并没有生效。对应的filter代码:@Activate(group = Constants.PROVIDER, order = Integer.MIN_

2020-05-20 23:39:43 410

原创 类加载系列之理解类加载

类的阶段在Java代码中,类型的加载、连接和初始化都是在程序运行期完成的。类有以下几个阶段:类加载:即查找并加载类的二进制数据类连接:验证:确保被加载类的正确性准备:为类的静态变量分配内存,并将其初始化为默认值解析:类的符号引用转换为直接引用类初始化:为类的静态变量赋予正确的初始值,运行static快中的代码。类使用类卸载类加载类加载:类的加载是指将类的.class...

2020-04-14 00:01:11 175

原创 HashMap拾遗(一)

开始HashMap是在开发工作中经常使用的集合类之一,熟悉其源码应该是基本要求。这篇文章对jdk1.8版本中的HashMap的一些常用方法的源码进行个记录。ps:这篇文章没有对其中的树化进行深究,比如提供的TreeNode内部类的结构和在扩容、Hash碰撞的时候的静态方法,之后有时间再研究下。源码分析1.1定义的变量常量 /** * The default initia...

2020-04-11 14:03:57 219

原创 Comparator接口在java8中的优化

开始Comparator接口或者Comparable接口在日常开发工作中是经常用到的,用于比较一组数据或者对象,在java8之后,也可以看到在Comparator接口中加入了一些default方法和static方法,这里做一个简单说明。Comparator接口和Comparable接口这两个接口首先要做一个简单区别。Comparable接口* Lists (and arrays) of...

2020-03-23 00:46:00 1190

原创 栈和队列相互实现

背景一道很经典的数据结构的题目实现。栈:一般是后进先出的顺序,可以看下java中的Stack这个类。队列:一般是先进先出的顺序,但是java中的Queue接口中也写了注释,没有要求是必须严格的先进先出,比如java中也有优先级队列、双端队列Deque。代码实现在代码的注释中有描述对应的思路,这里不去赘述两个栈实现队列/** * Created by zlj on 2020/3...

2020-03-22 22:13:52 204

原创 windows下typora图床(附带阿里云教程)

typoraTypora是大家写博客、记笔记、写文档等日常使用场景下都会使用的一个MarkDown语法的软件,对于熟悉markdown语法和喜欢markdown简洁性的朋友来说,typora是不可或缺的工具。但是,对于图片处理,我们需要图床去将我们的本地图片(截图、流程图之类的)上传到第三方的对象存储上(当然自己的服务器也是可以的)。本文基于一个typora在windows下的小插件windo...

2019-12-10 21:36:33 3590 11

原创 jvm参数分类

JVM参数的分类常用的JVM参数可以大致的分为三类,下边简单的将JVM的参数做一个分类,作为一个JVM参数的简单总结。JVM标准参数JVM的标准参数是指的在各个JDK版本中都比较稳定的,不会变动的参数,一般是针对jdk全局的参数。比如-help-server -client-version -showversion-cp -classpath这种参数称之为标准参数。JVM...

2019-08-07 00:48:28 983

原创 @DepnedsOn解决一个spring启动问题

前言最近遇到了一个启动失败的问题,原因是在bean初始化完成之后的钩子方法中使用获取容器中bean的工具类,(对应工具类之前的一篇博客 获取springbean)。分析这里具体的场景是我想实现一个bean在钩子方法中往一个策略map中注册自己作为一个策略使用,但是在启动的时候报错:第33行代码如下: public static <T> T getBean(@NotNull ...

2019-08-04 18:52:53 679

原创 一道题的思考

题目在小马哥的每日一问中看到了一道这个题:输出什么?。当时看错了在static块中的代码,就毫不意外的答错了= =,这个题其实没有看起来那么简单,这里去记录下这个题。小马哥这个每日一题的系列有很多比较"坑"的题,一般第一遍都比较难答对,推荐每天没事的时候可以去思否上看看这个题,也算拾遗一些基础~再来看看这个问题的代码:public class Lazy { private sta...

2019-08-04 18:16:08 263

原创 java枚举拾遗

前言java枚举是在开发过程中用的最多的类,这里对java之前的枚举常量类和枚举做了一个分析,并且对枚举相关知识拾遗。枚举类在出现枚举之前,通常是一个final类去表示"可枚举"这个概念,比如下面这个列举数字的枚举类/** * 模拟枚举类 (枚举类:在enum出现之前的表达 可枚举的含义的类) * 通常 private 构造函数 * final class * private st...

2019-06-14 17:42:11 200

原创 redis命令拾遗(字符串操作)

前言前一段时间一直在忙,拉下了一些知识的学习,现在努力追赶修补中。= =当然也有一些新的知识的学习,但其实更多的是关于一些知识的拾遗。之前在工作当中发现对redis命令掌握的还不是很完善,所以想花比较少的碎片时间去写一下redis常用命令的拾遗。redis命令对这些命令的拾遗记录是在网站:http://redisdoc.com上进行学习的,很简单明了,推荐给大家进行学习拾遗。这里只是把日...

2019-05-20 01:12:18 147

原创 dubbo基础(五)——dubbo接口的特性设置

dubbo的一些配置之前的文章中写了dubbo的初步使用和dubbo和springboot的使用整合,这里来总结下dubbo框架暴露接口常用的配置项。启动时检查dubbo提供了在服务启动时的一些检查机制,这个机制包括consumer端对服务提供者的检查、dubbo对注册中心的检查。可以看下官方文档中dubbo:reference标签中关于check属性的配置。可以看到是默认在启动时检查...

2019-04-01 00:56:03 572

原创 dubbo基础(四)——dubbo的配置加载

dubbo的配置在之前的文章中配置了spring boot和dubbo框架的使用(传送门:springboot使用dubbo框架),看到了把dubbo相关的配置配置在了配置文件中。这里官方文档中也去讲解了对应的dubbo配置的加载。dubbo的配置加载流程首先要知道dubbo的配置是在应用启动阶段,并且这里的配置包括应用配置、注册中心配置、服务配置等。dubbo的配置来源Jvm Sy...

2019-03-21 23:40:00 1406

原创 dubbo基础(三)——springboot使用dubbo框架

dubbo集成spring bootspring boot肯定是现在用的做多的开发框架,而dubbo框架是最流行的rpc框架之一,整合springboot和dubbo的使用很有必要。本篇博客还是根据上一篇中的dubbo简单demo的简单示例来整合spring boot。(上一篇传送门:dubbo-demo)依赖因为是springboot项目,dubbo官方也提供了dubbo的starter...

2019-03-20 22:52:01 453

原创 dubbo基础(二)——dubbo简单demo

get start在上一篇中介绍了dubbo诞生的背景和框架的特性:dubbo概念和基本概念,这里就来一个dubbo的简单使用小体验。dubbo注册中心安装dubbo中的官方文档的快速启动使用的是multicast广播注册中心暴露服务地址,这里选择的是使用zk作为注册中心,因为zk是很多公司作为dubbo注册中心,并且zk也是dubbo官方文档中推荐使用的注册中心。本次是使用的mac上安装...

2019-03-18 23:56:46 338 1

原创 设计模式——装饰者模式

装饰者模式装饰者模式是java IO流中使用的一个经典模式,本文会简单介绍装饰者模式的原理和解决的问题,并且以一个咖啡demo来演示装饰者模式。装饰者模式的定义装饰者模式遵守的设计原则:开闭原则(类应该支持扩展,而拒绝修改)装饰者模式通过组合的方式扩展对象的特性,这种方式允许我们在任何时候对对象的功能进行扩展甚至是运行时扩展,而若我们用继承来完成对类的扩展只能在编译时实现,可以比较动态地...

2019-03-16 19:29:20 375

原创 一次排查$jacocoData的过程

起因最近在开发过程中,遇到了一个奇怪的现象,在测试环境去利用反射拿一个类的字段时,发现拿到的field数组中多了一个奇怪的变量:$jacocoData,是一个static的boolean数组:很明显jacoco这种统计代码覆盖率不是我定义在一个业务含义的类中,这时考虑到可能是测试环境中对代码覆盖率在编译时对字节码进行了修改,于是去测试环境的机器上看这个jar包。疑惑点在机器上对jar包...

2019-03-11 00:04:44 8937 1

原创 dubbo基础(一)——dubbo的整体简介

入门dubbo是公司选择rpc框架时首先会去选择的框架,好好了解dubbo框架是一个合格程序员的必经之路。这里作为dubbo的入门篇,把一些概念和官方文档搞清楚一定是最应该开始的步骤。dubbo框架诞生的背景dubbo框架满足的需求dubbo框架的整体架构...

2019-03-06 23:36:59 149

原创 使用telnet测试dubbo接口初使用

背景dubbo接口的测试不像controller的http接口那么容易测试,这里去了解了下使用telnet去测试参数没那么复杂的dubbo接口。正题首先看看一个dubbo接口的代码:public interface ShopAggregateRemoteService { /** * 获取所有产品类型 聚合字段的产品类型范围[软件+有伴服务] * @param...

2019-02-26 00:09:32 2428

原创 《并发编程艺术》中的线程状态

线程的状态线程的状态很早之前就理解过了,最近翻《并发编程艺术》的书时候,看到有个点之前理解的不太对。书中的线程状态分类new 初始状态,线程被构建,但是还没有调用start()方法runnable 运行状态,java中将操作系统中的就绪和运行两种状态笼统称作”运行中“(这里没有网上常见的Running状态)blocked 阻塞状态,表示线程阻塞于锁waiting 等待状态,表示线程进...

2019-02-24 14:54:20 178

原创 并发编程——Thread API

这篇主要介绍Thread API,也是并发编程中的基础Thread一些常用API守护线程守护线程的概念和原理可以见:守护线程和非守护线程守护线程的一个应用:比如在做长连接的时候,需要一个心跳检查线程,这个线程就应该设置为后台线程,这样当整个连接关闭时,也会跟随连接线程消亡。这里可以在一个线程中再创建一个后台线程,来验证上述的这个应用:/** * 这里对后台线程提出一个问...

2019-02-22 01:16:53 177

原创 并发编程——基础拾遗

并发编程基础拾遗在看并发的书或者看并发相关的博客时,会发现一些知识点会遗漏或者之前没有看到,这里去总结一下。创建线程相关main线程我们通常会通过写main方法去创建多个线程,main线程是非守护线程,代表方法的入口。这个时候如果用jconsole去看的话,会发现这时也会启用很多后台线程:比如GC线程、计算引用线程、JMX线程。线程生命周期新建状态可运行状态运行状态阻塞状态...

2019-02-12 01:44:39 135

原创 设计模式——模板方法的一个应用

模板方法模板方法很多情况下代码中的业务都可以抽象出一个模板去解决,这时候经常需要用到模板方法。大家经常接触到的是一些业务方法的抽象模板,比如在计算优惠券的流程当中总是有一定的步骤:(1)先计算该商品是否可以拥有优惠券信息(2)再为该商品绑定优惠券信息(3)最后回调或者通知向下的流程今天要记录的是一个通用服务层的模板方法,包含了前置校验、后置处理(是有点像拦截器= =)、finally操...

2019-02-02 00:47:06 193

原创 设计模式——观察者模式

观察者模式观察者模式也是我们经常会用到的设计模式之一,这里用一个气象站的一些数据变化通知气象板为例去记录一下观察者设计模式,值得一提的是java中提供了观察者模式的接口和类。demo一个气象站通知气象板的小demo,气象站提供温度、气压、湿度的数据给一些气象板提供数据,当气象站发生变化了之后,要通知订阅气象站数据的气象板数据变更。一般方案在气温变化的气象站中加入气象板对象,在数据变化时...

2018-12-31 02:25:27 162

原创 深拷贝和浅拷贝

深拷贝与浅拷贝对对象的深拷贝和浅拷贝我们并不陌生。(1)浅拷贝:在浅拷贝中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。简单来说,在浅拷贝中,当对象被复制时只复制它本身和其他包含的值类型的成员变量,而引用类型的成员对象并没有复制。在Java中,通过覆盖O...

2018-12-24 20:37:34 176

原创 java集合类的一些总结——Arrays.asList和Guava操作集合

使用背景总结一下最近项目中使用到集合的两个点,一个是Arrays.asList这个方法使用的坑,另一个是利用Guava的Sets工具类去求并交集。使用总结Arrays.asList的坑先上结论:Arrays.asList这个方法不适用于基本类型:byte,short,int,long,float,double,boolean该方法将数组和列表动态链接起来,当其中一个更新后,另一个也会...

2018-12-16 02:15:39 2442

原创 ClassNotFoundException和NoClassDefFoundError

背景极客时间上《Java核心技术36讲》第二讲中提到了一个问题:ClassNotFoundException和NoClassDefFoundError有什么区别?看到这个问题的时候,第一时间想到的就是一个是受检的异常,而另一个是一个Error,但是其实在真正的项目开发中这两个错误都遇到过,都是关于类或者文件jar包找不到的错误,这里去总结下其中的不同。两者的区别ClassNotFoundE...

2018-12-07 17:00:58 1396

原创 Java36讲总结(一)——Java平台型的理解

背景最近看了一点点极客时间上的《Java核心技术36讲》,打算把一些自己感兴趣或者不知道的点总结到博客中,方便对一些知识有一些整理和拾遗。Java平台性的理解java本身是一种面向对象的语言,有两个特征,一是“write once, run anywhere”,能够非常容易的获取跨平台的能力;另外就是垃圾手机机制,Java通过垃圾收集器(Garbage Collector)回收分配内存。我...

2018-12-02 23:41:26 265

原创 并发编程——并发基础:守护线程和非守护线程

前言最近在复习的时候,发现一个运行线程池拒绝策略demo中的main方法在运行了之后,进程并没有关闭。看了jconsole线程池中的线程都处于waiting状态。这里是跟我设置线程池的线程工厂中的设置线程是否为后台线程有关。后台线程和非后台线程后台线程,也叫守护线程,指的是在程序运行的时候后台提供一种通用服务的线程,比如jvm里垃圾回收线程,这种线程并不属于程序中不可或缺的部分。因此,当所有...

2018-11-27 00:40:58 1551

原创 记一次url参数截断的问题

问题现象在最近的开发过程中要根据一堆id值去删除ES中的数据,就写了一个脚本接口,传入了idList。这里选择的是GET方式的接口,将idList以逗号分隔当做字符串传入当做参数,然后在接口中转换成List类型再对ES进行操作。脚本代码这个接口中的process是为了控制是否真正执行刷数据的逻辑,在一些刷数据的接口中加入这个参数,可以去在真正去刷数据之前,去看看捞出来的数据是否正确,然后再进...

2018-11-25 02:17:22 1319

原创 FastJson中的一些用法

FastJson中的一些用法总结fastJson在工作过程中经常用到的一个工具类,之前用到的最多的是在输出日志的时候的对java对象输出序列化之后的json字符串,最近在消费消息端也用到了JsonObject这个类的一些功能,做个简单的FastJson功能类的查漏补缺。JSONObject通过观察fastJson的源码我们可以发现JSONObject是实现了Map&amp;lt;String, Ob...

2018-11-22 00:47:49 618

空空如也

空空如也

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

TA关注的人

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