自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 收藏
  • 关注

原创 Linux中的网络I/O模型

对于这几种I/O模型,生活中其实存在很多例子,我们以去售票窗口买车票为例,说明这几种I/O模型的区别。堵塞型I/O:到窗口去买票,如果此时没有票,你一直等在窗口前(堵塞),直到该窗口有车票准备好,你从窗口取票离开。非堵塞型I/O:如果窗口没有票,你就去做别的事情,你每隔一段时间来看一下有没有票(轮询),直到有票你取票离开。多路复用型I/O:买票的时候由专人负责维护所有排队买票的人,并且收集每个人的买票需求,当窗口有票的时候,专人负责通知需要车票的人去窗口取票。...

2022-08-09 09:37:04 345

原创 使用gRPC进行跨语言服务通信

​     gRPC是基于HTTP/2的通信协议框架(Dubbo是基于tcp的),同时采用了Protocol Buffers(Protobuf) 作为序列化框架。protobuf也是google开源的一款序列化产品。与开发语言无关,和平台无关,具有良好的可扩展性。Protobuf和所有的序列化框架一样,都可以用于数据存储、通讯协议。众所周知,使用一些老牌的rpc框架如Dubbo等很难进行不同语言服务之间的通信(当然Dubbo目前也已经引入了protobuf进行跨语言通

2021-09-13 15:26:21 1633

原创 ScheduledExecutorService内线程异常导致任务中断

    今天遇到一个关于ScheduledExecutorService的诡异问题,执行ScheduledExecutorService.scheduleAtFixedRate()方法过后,这个定时任务只执行一次便不再执行,可以说非常诡异。最后经过仔细排查终于发现了这个问题的出现原因。先看一段代码:    这段代码会抛出异常,但是因为没有捕捉异常所以对于javaer根本感知不到异常,最终的执行结果如下:可以看到程序也没

2021-08-29 17:58:31 2624 1

原创 六大设计原则(上)

六大设计原则(上)​ 为了督促自己读书,开启了三十天读一本书的计划,第一本书就是《设计模式之禅》,今天正式开启读书计划,在博客中进行读书笔记的整理,《设计模式之禅》中第一章内容没有讲述设计模式,而是先介绍了编码的六大原则,我将会依照该书的顺序进行整理。下边介绍软件设计中的六大原则中的两个。1.单一职责原则​ 定义:一个类(或者方法)的职责应该是单一的,应该有且仅有一个原因引起类(或者方法)的变更。 说的通俗一点就是一个类(或者方法)只允许干一件事,不能把所有的事情都揉在一起。类的单一职责​ 举个

2021-08-24 10:32:43 143

原创 Java使用JNI调用动态链接库(Mac版)

​ 最近在学习C/C++,算是刚刚入门,之前一直从事Java开发,一直就听过看过JNI的一些使用,但是一直没动手实验过,所以这次想借着这个机会实现一下,让我的知识连贯起来,但是果真一看就会一动就废,尤其是我的电脑还是Mac的M1芯片,在整个JNI的实现过程可谓是一波三折。1.前置知识​ 在使用JNI之前我想先介绍一下什么是链接以及什么是静态链接和动态链接(没有学过C/C++可以先跳过),所谓静态链接就是链接静态库的过程,动态链接就是链接动态库的过程,那么什么是静态库和动态库呢?他俩其实是一个相对的概念,

2021-08-01 19:12:34 1544 5

原创 视频编解码基础

视频编解码解析​ 通常我们人们口中说的“播放这个视频”,“给你发个视频”等等,其实在很多情况下是我们指的是视频封装格式,这其中包含了音频和视频两部分以及字幕等等其他很多的内容,这是人们的一种习惯叫法而已,但是在技术层面音频和视频还是有区别的。视频和音频在百度百科中定义:视频:泛指将一系列静态影像以电信号的方式加以捕捉、记录、处理、储存、传送与重现的各种技术。连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫

2021-07-26 10:25:52 1499

原创 共识算法-Paxos&Raft

1.共识算法的提出先讲个故事:​ 一组拜占庭将军分别各率领一支军队共同围困一座城市。各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票(少数服从多数)来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。(来自维

2021-07-26 10:22:18 1182

原创 微服务会话管理

微服务会话管理​ HTTP是无状态的协议,因此服务器无法确认用户的信息。W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是:服务器向用户浏

2021-03-14 18:34:38 564

原创 Https通信原理解析

Https原理解析Https简单介绍​ 众所周知,https就是http的升级版协议,他比http更加安全,但它是如何实现安全机制的呢?其实剖开去看无非就是https在传输过程中把数据加密了,http在传输过程中不进行加密,直接就是以明文转为二进制流的形式在网络上进行传播,但是https则是传输之前将数据进行一次加密,在读取数据的时候进行解密。加密方式介绍​ 那么上边我们提到了加密解密,我们就要考虑的是如何进行加解密?如果区分常见的加密方式就是对称加密和非对称加密。对称加密:加密和解密的双方使用

2021-03-14 18:25:56 653

原创 JDK8中的HashMap源码解析与理解

jdk8中的HashMap源码解析与理解一、预备知识关于hash:​ 有个非常关键的特点,不定长度的输入固定长度的输出,将一个对象经过一定的hash算法映射成相同长度的hash值。hash冲突的避免:​ hash是无法完全避免的,只能通过各种方法手段尽量的减少hash冲突。关于hash碰撞的解决方案:开放地址法:假设一个数组有四个长度此时存放了[8,null,10,11,null]两个为null的位置代表没有数据,此时如果有个15来了,15mod 4=3那么这个15应该放在下标为3的位置上

2020-10-30 14:19:48 861 2

原创 Synchroized锁的是什么

Synchroized锁的是什么闲来无事,写篇文章,讲讲synchronized锁的到底是什么。1.Synchronized怎么用?​ 一般Synchronized有如下三种用法:/*** 下边两种是一样的情况*/synchronized (this) { ......}//--------------------------------------------Object object=new Object();synchronized (object) { ......

2020-10-29 20:52:51 173

原创 volatile原理解析与cpu内存架构

Volatile详解一、Intel硬件提供了一系列的内存屏障:lfence,是一种Load Barrier 读屏障sfence, 是一种Store Barrier 写屏障mfence, 是一种全能型的屏障,具备ifence和sfence的能力Lock前缀,Lock不是一种内存屏障,但是它能完成类似内存屏障的功能。Lock会对CPU总线和高速缓存加锁,可以理解为CPU指令级的一种锁。它后面可以跟ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC

2020-10-21 16:50:57 414

原创 CAS与volatile实现解析

CASCompare And Swap (Compare And Exchange) / 自旋 / 自旋锁 / 无锁因为经常配合循环操作,直到完成为止,所以泛指一类操作cas(v, a, b) ,变量v,期待值a, 修改值bABA问题,你的女朋友在离开你的这段儿时间经历了别的人,自旋就是你空转等待,一直等到她接纳你为止解决办法(版本号 AtomicStampedReference),基础类型简单值不需要版本号UnsafeAtomicInteger:public final int incre

2020-10-20 08:44:29 301

原创 GC与实战

GC和GC TuningGC的基础知识1.什么是垃圾C语言申请内存:malloc freeC++: new deletec/C++ 手动回收内存Java: new ?自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出两种类型的问题:忘记回收多次回收没有任何引用指向的一个对象或者多个对象(循环引用)2.如何定位垃圾引用计数(ReferenceCount)根可达算法(RootSearching)3.常见的垃圾回收算法标记清除(mark sweep) - 位

2020-10-20 08:30:06 663

原创 ThreadLocal源码解析与理解

ThreadLocal源码解析一、ThreadLocal的使用​ ThreadLoca是一个本地的线程变量,他能够做到线程与线程之间的隔离,它其中填充的变量只属于本线程,它为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。​ 他的用法也非常简单:ThreadLocal<String> threadLocal=new ThreadLocal<>();threadLocal.set("1");threadLocal.get();threadLoca

2020-10-19 20:25:47 231

原创 Github的常用搜索操作

 关于Github大家可能会经常使用,今天也是在使用的过程中翻到了之前的一个笔记,笔记的内容有些遗忘了,今天整理到这篇博客中吧。 首先Github作为代码仓库其中保管了大量的项目代码,但是如何在最短的时间内找到自己想要的项目代码呢?因为我们一搜某个项目只能在github的搜索框中搜索,一旦搜索就会出现很多条数据,有没有其他条件可以限制一下呢。接下来简单介绍一下常用的几个搜索条件。 首先我们可以...

2020-03-01 23:20:46 940

原创 关于jvm的个人整理

Jvm是Java程序员永远绕不开的一个话题,今天聊下jvm,jvm主要的构成部分主要有以下的几部分:1.方法栈:该部分是线程独享的,每一个方法在其中就是一个栈帧当执行方法时候方法就会压入其中,称为压栈执行,在每个栈帧中维护了一个局部变量表用来存用用到的基本数据类型和对象的引用。2.程序计数器(PC寄存器):它记录了程序执行的位置,他也是线程独享的,在采取时间片轮询的时候它记录了线程挂起的位置。...

2020-02-26 23:38:20 109

原创 关于Spring启动早期最先注册的六个BeanDefinition的解释

 在spring初始化的过程中会注册六个非常重要的beandefinition,他们的名字分别是:1.org.springframework.context.annotation.internalConfigurationAnnotationProcessor2.org.springframework.context.annotation.internalAutowiredAnnotatio...

2020-02-25 19:39:35 591

原创 聊聊Spring中的ConfigurationClassPostProcessor

 之前有讲到过在Spring中有各种各样的BeanFantoryPostProcessor后置处理器,在这些后置处理器中有一个对于Spring使用java Config起着至关重要的后置处理器,他就是ConfigurationClassPostProcessor,因为通过他的一个方法postProcessBeanDefinitionRegistry会进行类的扫描以及注册,在这个方法中对于配置类进行...

2020-02-23 16:37:27 2573

原创 关于JVM的解释执行与编译执行

 在现代虚拟机(像HotSpot)在执行java代码的时候通常采用编译执行和解释执行相结合的方式,所谓的解释执行就是采用解释器来读取字节码,遇到相应的指令就是执行指令。所谓编译执行就是通过即时编译器(Just In Time,JTI)将字节码转为本地机器码来执行;现代jvm会根据热点 代码来生成相应的本地机器码。 在程序执行的时候有两种指令集,一种是基于栈的指令集一种是基于机器的指令集,关于这两...

2020-02-21 18:36:56 533

原创 聊聊Spring中的BeanFactoryPostProcessor以及其子类

 BeanFactoryPostProcessor顾名思义bean工厂的后置处理器,它主要是对bean工厂做一些操作,他可以利用其中的postProcessBeanFactory方法对beanfactory做一些操作,同时他有一个比较厉害的实现类BeanDefinitionRegistryPostProcessor,这个抽象类继承了BeanfactoryPostProcessor,同时多定义了一个...

2020-02-20 09:23:56 1017

原创 Spring使用多级缓存解决循环依赖的问题

 在Spring的依赖中有一个比较特殊的依赖,它比较复杂而且重要,今天就来聊一下Spring中的依赖----循环依赖。 循环依赖实际上是一种问题,他的描述就是一个A对象依赖了B对象,而B对象又依赖了A对象,所以这样产生了循环依赖这个问题,在Spring中会又三种循环依赖的情况,他们分别是两个对象中的构造方法中产生了依赖关系,另外一种情况就是单例模式下的set方法的循环依赖关系,第三种情况就是多例...

2020-02-16 22:51:03 1917

原创 关于Spring中的DispatcherServlet和ContextLoaderListener的配置源码解读

 在我们的spring项目搭建的过程中通常会使用web.xml会经常看到如下的配置: 在web.xml中我们配置了一个ContextLoaderListener和一个DispatcherServlet,但是我们从来没有关心过为什么要在这里配置一个监听器和一个servlet,并且也没有考虑过如果不使用web.xml能不能实现这个功能。今天我们就来讲解一下这两个东西到底做了什么,再就是有没有其他的...

2020-02-06 20:46:55 423

原创 Reactor模式的详细介绍以及netty对其的具体实现

 关于Reactor与Proactor模式在上一篇文章中有过简单的介绍,本文想主要介绍一下Reactor模式,因为无论是java的Nio还是netty都很好的使用了Reactor模式,可见这种模式的重要作用,本文主要参考了并发大神Doug Lea在《Scalable IO in Java》一文中的一些讲解,同时也参考了 Jim Coplien 和Douglas C. Schmidt在95年发表在的...

2020-02-05 17:38:06 478

原创 理解Reactor模式与Proactor模式

 我在之前的文章中有写过对堵塞非堵塞,同步异步的一些理解,由于最近在看一些netty的资料,并且netty是Reactor模式的一种优秀实现,所以想借此机会简单介绍下我对于常见的两种Io模式的理解,在目前的各种应用中最为常见的要数Reactor模式,因为Proactor模式需要操作系统的支持,所以世面上有很少的关于Proactor模式的实现,Proactor模式是将来的一种趋势,因为硬件和操作系统...

2020-02-04 23:38:56 671

原创 使用Redis的api实现mq生产消息的异步补偿

 在生产环境中各种应用的开发越来越多的使用到了mq消息队列,很多mq的中间件都实现了消费者消费消息失败的补偿机制,但是mq的生产者发送消息失败是个令人头疼的问题,因为mq并未对其做一些补偿,所以今天就来介绍一个利用Redis实现的补偿机制。  使用Redis作为补偿的思路就是利用了Redis中的各种api,如果业务流程中生产者发送消息失败业务流程感知到立刻调用storemsg方法将消息存储到Re...

2020-02-04 09:10:01 1176

原创 Redis分布式锁以及一种简单的锁时间自行延长的实现讨论

 在分布式环境中普通的java的锁是无法很好的控制的并发的在分布式环境中分布式锁有主要有两种实现方式,一种是利用Zookeeper的可以作为注册中心的特性进行实现,另外一种就是利用Redis实现的分布式锁,两者各有千秋利弊,因为redis和zookeeper的特性是不一样的,有一点比较明显的如zookeeper保证的CAP原则中CP(一致性和分区容错性),而Redis保证的是AP(可用性和分区容错...

2020-02-03 22:42:48 2038

原创 关于在Redis集群模式下不支持Scan和pipline的解释以及解决方案

 最近在写程序的过程中遇到一个问题,就是需要删除redis中key值以某个字符串开头的数据。因为通过查阅资料以后说如果数据量过大使用keys可能会产生死锁,并且速度会很慢,所以通过查阅各种资料发现使用scan会是比较好的一种方案,但是在真实的开发过程中发现了单节点的redis会支持scan但是集群环境中并不支持scan命令(本人使用的是redistemplate),不仅如此并且之前所熟知的Pipl...

2020-02-03 21:28:08 10792 5

原创 Tomcat源码解析(三)---关于tomcat中的WebAppClassLoader

    上一部分讲到关于tomcat中的类加载器部分,个人认为在tomcat8以后tomcat并未通过,commonLoader,catalinaLoader,sharedLoader三者来打破双亲委派的模型,因为在tomcat8中并未对catalinaLoader和sharedLoader两者对应的文件进行配置,所以在默认的情况下通过源码我们可以得知三个类加载器都是一样的,都是创建了一个URLC...

2019-12-11 23:13:01 664

原创 Tomcat源码解析(二)---Tomcat中的类加载器

分析tomcat源码首先就要从tomcat的入口(tomcat的main方法)开始,tomcat的main方法在Bootstrap的这个类中,tomcat的启动main方法就在这里边,当jvm加载Bootstrap这个类的时候会执行其静态代码块,在bootstrap中有有一段静态代码块如下(省略了部分代码):static { // Will always be non-null...

2019-12-01 22:42:32 154

原创 Tomcat源码解析(一)---Tomcat整体架构

    作为重度拖延症患者,读了这么久的源码以至于有的点都淡忘了,终于开始写tomcat的源码了,关于我在博客中tomcat的介绍纯属个人的一点点浅薄的见解,如有人读到有哪些错误或者认识不够到位的地方可以一起交流,后期也会对播客进行改进。    了解tomcat的源码之前先了解下Tomcat的整体架构,一个Tomcat整体就是一个Server实例,它是最顶层的组件在源码中的体现就是Standar...

2019-11-29 23:07:09 293

原创 关于Linux中的零拷贝技术以及java中的零拷贝

    所谓的零拷贝并不是真正的没有拷贝的过程,个人认为这里的零拷贝只是针对于用户空间和内核空间的拷贝而言的,如果内核空间和用户空间之间没有发生拷贝则是零拷贝,零拷贝依赖与操作系统的很多技术支持,今天就来聊下零拷贝技术以及发展。传统的拷贝技术:    传统的拷贝技术是指在零拷贝出现之前当应用程序进行网络通信时候需要首先由应用程序发起read()系统调用,系统中断此时由用户态切换至内核态,系统将...

2019-11-29 21:37:12 249

原创 操作系统的虚拟内存和物理内存

  早期的计算机系统只有物理内存的概念,所谓的物理内存就是真实的内存直观一点就是咱们计算机的内存条,他的大小决定了内存的大小。但是直接使用物理内存会存在很多的问题,首先就是直接使用物理内存可能会产生很多的内存碎片,因为如果把程序读取到内存需要连续的内存空间,由于对物理内存进行分页后会导致很多次的内存分割这样会产生很多的内存碎片。直接使用物理内存最主要的问题就是内存不足的问题,如果一个需要很大内存的...

2019-11-27 00:18:28 1324

原创 Redis的缓存雪崩、缓存穿透、缓存击穿以及解决方案

    在redis比较流行的时代,redis的使用也面临着一些问题,今天就来简单讲下关于redis使用中会遇到的问题以及解决措施。    缓存雪崩:假设redis的key的失效时间都是1个小时,在一个小时以后所有的key全部失效,但是此时有大量的用户涌入,就会导致所有用户的请求全部落在数据库中,导致数据库因压力过大而宕机,这就是缓存雪崩,缓存雪崩的特点就是访问量大,失效的key多,且落点不在r...

2019-11-26 00:56:14 134

原创 mybatis使用注释不当报错Parameter index out of range (2 > number of parameters, which is 1)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...

2019-10-26 09:40:09 1379 2

原创 Spring报错 conflicts with existing, non-compatible bean definition of same name and class

如果出现这个错误可能有两种情况:1.那就是你的spring容器中确实注入了两个同名的对象,这个需要仔细检查自己的@Service、@Controller、@component是不是有相同的value值,或者xml文件中有两个一样的id2.就是在maven环境下你的文件是从其他地方拷贝过来的,这时候需要clean一下然后重新启动,因为可能你的环境中存在了一份这样的文件。(被这个问题搞的头大)...

2019-10-24 22:07:16 19761 4

原创 maven编译XX是内部专用类 将来会在专用api中删除

针对这个错误目前有两种解决方案:1.修改红色部分版本号为2.3.2 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> ...

2019-10-23 10:51:17 407

原创 git常用命令

git在版本控制方面有很多优秀的特性,所以越来越受到广大开发者以及各种企业的青睐,越来越多的人选择它来做版本控制的工具,所以今天来聊下git的基本使用和常用命令。一般开发者使用git都是从github或者gitlab上下载或者上传程序(以下将两者称为远程仓库),如果说这个程序在远程仓库中已经存在如果想克隆到本地,则不需要使用git init命令初始化仓库,只需要在你想下载到本地的目录打开git ...

2019-10-22 10:13:48 143

原创 关于jvm运行机制--类加载器(二)

上篇文章介绍到类加载器的双亲委派机制,但是jvm的类加载器为什么要采取这种的实现方式呢?1.可以确保java核心类库的安全放着了jar包的冲突,例如所有的Java的应用可能都会使用java.lang.Object这个类,这个类是由启动类加载器加载的,如果他的子类加载器也加载了同样的类或者版本不一样的类可能就会产生冲突。2.确保了Java的核心类不会被自定义的类所取代,假如自定了和核心类同名的类...

2019-10-21 14:10:32 126

原创 关于jvm运行机制--类加载器(一)

最近在看关于jvm运行原理简单了解了一下类加载器部分,欢迎有了解的朋友一起讨论。先上一段关于jvm的类加载过程,关于类记载过程在《深入了解jvm虚拟机》一书中已经有过明确的解释,类的加载过程分为加载–>连接(验证、准备、解析)–>初始化–>使用–>卸载等过程。关于前三个阶段做一下简单介绍,加载简而言之就是将一个类通过二进制字节流的形式读取到方法区;验证就是对这个二进制文...

2019-10-19 09:39:04 103

空空如也

空空如也

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

TA关注的人

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