自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

莫失莫忘的博客

努力学习,努力充实

  • 博客(185)
  • 资源 (1)
  • 收藏
  • 关注

原创 Spring循环依赖

一、什么是循环依赖依赖是类与类之间的一种关系。A依赖B,可以理解为 使用A的时候会需要B,那么循环依赖,就是这种关系是双向的,也就是使用B的时候需要A。![image.png](https://img-blog.csdnimg.cn/img_convert/bfff75c3b48cac50cb4d115d6bb779e0.png#clientId=u8191ba3f-8240-4&crop=0&crop=0&crop=1&crop=1&from=paste&amp

2022-04-10 17:34:51 268

原创 SpringBoot的底层入口SpringServletContainerInitializer

SpringServletContainerInitializer参考之前的博文无配置文件SSM那么容器启动时候,为什么这么MyWebAppInitializer这个类会被加载呢,进而创建根容器,创建web的ioc容器呢来看这个类的介绍:WebApplicationInitializer是Spring MVC提供的一个接口,它确保检测到您的实现并自动用于初始化Servlet 3容器。WebApplicationInitializer的抽象基类实现AbstractDispatcherServletI

2021-03-13 11:27:35 752 1

原创 RabbitMQ创建队列及交换机、重试、ACK机制的使用

一、 前言:之前使用rabbitMQ时只是简单的应用,停留在demo的概念上,本片博客是结合实际使用时会遇到的问题,在之前那篇文章springboot整合RabbitMQ简单使用基础上,继续进行讨论,有兴趣的可以看看之前那篇文章,里面有一些基本的概念介绍。二、摘要:本篇文章将尝试回答这么几个问题:SpringBoot中创建RabbitMQ的队列、交换机、及绑定的几种方式?RabbitMQ中的ack机制是什么、如何使用?RabbitMQ中confirm-callback与return-cal

2020-10-11 15:01:32 5497 7

原创 Spring的AOP源码分析(总结)

经过这四篇文章,简单把springaop的过程分析了一下Spring之AOP初体验Spring的AOP源码分析(一)@EnableAspectJAutoProxySpring的AOP源码分析(二)AnnotationAwareAspectJAutoProxyCreator工作原理Spring的AOP源码分析(三)代理对象的创建Spring的AOP源码分析(四)目标方法执行下面来进行总结...

2019-08-12 14:55:15 303

原创 Mybatis的plugins的入门helloworld介绍以及原理分析

Mybatis的plugins先看一下官方文档对mybatis的plugins的介绍:MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClos...

2019-05-19 19:56:14 342

原创 分布式锁Zookeeper

Zookeeper是一个开源的分布式协调服务,它设计的目的就是将那些复杂容易出错的分布式一致性服务封装起来,提供统一的解决方案。ZooKeeper 为我们提供了高可用、高性能、稳定的分布式数据一致性解决方案,通常被用于实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

2023-03-15 10:46:34 286 1

原创 分布式事务

一、TCC分布式事务的一种解决方案:Try :锁定资源或预留Confirm:正式执行资源Cancel:发生异常解冻资源业务侵入性,每个操作需要改造成3个接口,进行处理。 cancel的处理通常会相当复杂支付,交易的用相关;二、可靠消息最终一致性使用阿里的RocketMQ来实现消息事务。1.A系统发送 pre消息2.A系统执行本地事务,成功后发送confirm消息;失败回滚本地消息,并回滚刚刚那个 prepared消息如果发送了confirm消息后,B就会获取到改消息mq

2023-03-15 10:42:37 358

原创 Timer&DelayQueue&ScheduledThreadPool

核心是一个优先级队列和一个封装执行任务的线程。大致逻辑如下:内部维持了一个小顶堆,按时间排序,最近要执行的任务排在第一个。不断获取第一个判断当前是否需要执行。jdk自带的一个延迟队列工具,元素必须实现delay接口底层内部也是通过 Priority优先级队列实现。重写take方法通过 delay获取延迟时间。队列的插入和删除的时间复杂度Ologn。可以执行定时任务的线程池。

2022-12-28 14:02:41 229

原创 Tomcat(五)网络连接器-AprEndPoint

一、什么是APRAPR(Apache Portable Runtime Libraries)是 Apache 可移植运行时库,它是用 C 语言实现的,其目的是向上层应用程序提供一个跨平台的操作系统接口库。Tomcat 可以用它来处理包括文件和网络 I/O二、AprEndPointAprEndPonit与NioEndPoint类似,都是实现了非阻塞的I/O,但是区别就是aprEndPoint是通过调用JNI调用本地的库实现非阻塞IO的。本地库是使用C语言编写,当频繁的IO操作时,效率会高于java语

2022-05-22 21:38:23 362

原创 Tomcat(四)网络连接器-Nio2EndPoint

一、异步IO异步最大的特点是,应用程序不需自己去触发,数据从内核空间叫用户空间的拷贝。应用程序是无法主动访问内核空间的。那么有两种处理方式,有两种方式:**1、内核主动拷贝数据到应用程序中 **2、等待应用程序通过 Selector 来查询,当数据就绪后,应用程序再发起一个 read 调用,这时内核再把数据从内核空间拷贝到用户空间。数据准备好后,数据从内核拷贝到用户空间的这一段时间,应用程序还是阻塞的。二、异步IO与同步IO的区别**异步IO:**通过注册的回调函数,内核会主动通知数据。

2022-05-22 21:36:32 346

原创 Tomcat(三)网络连接器-NioEndPoint

EndPoint的主要作用就是进行网络连接一、IO模型所谓I/O 其实就是内存与外部设备拷贝数据的过程网络IO通信过程:对于一个网络I/O通信过程,比如网络数据的读取,会涉及两个对象。一个是调用这个IO操作的用户线程,另一个就是操作系统内核。 当发生IO操作时,网络数据读取会经历两个步骤:用户线程等待将数据从网卡拷贝到内核空间,内核将数据从内核空间拷贝到用户空间各种 I/O 模型的区别就是:它们实现这两个步骤的方式是不一样的。有5种IO模型:同步阻塞IO, 同步非阻塞IO, IO多.

2022-05-22 21:34:57 602

原创 Tomcat(二) 启动流程

一、Tomcat请求流程组件是如何创建,初始化,销毁的呢,管理他们的生命周期是一个很关键的问题?如何实现一键启动?答:tomcat的核心组件都抽象出公共的部分 lifecycle接口其中定义了:init()、start()、stop() 和 destroy()这么几个核心方法;在父组件中创建的时候需要调用子组件的init方法。所以只要调用顶层的 Service的init方法,整个tomcat就启动了。这是lifecyle的模版方法 @Override public final sync.

2022-05-21 17:57:15 264

原创 Tomcat(一) 系统架构

一、Tomcat系统架构-连接器tomcat设计了两个核心组件:连接器Connector, 容器Container;连接负责对外交流,容器负责内部处理;连接器的基本功能:1、监听网络端口2、接收网络请求连接3、将请求解析转换为 Tomcat Request 对象4、将Tomcat Request 转换为 Servlet Request**5、调用Servlet 获得 Servlet Response **6、将获得的结果转换,响应返回给前端根据上述功能,Tomcat 就把它抽象成了三个.

2022-05-21 17:56:08 337

原创 Redis总结

一、什么是ReidsRedis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。二、Redis为什么快内存数据库内存访问数据快高效的数据结构,数据类型 String、List、Hash、Set、Sor.

2022-05-14 21:23:11 714 1

原创 CyclicBarrier

一、介绍CyclicBarrier线程同步屏障,他的使用场景是,等一组线程到达屏障后,然后再同时放行。二、使用案例@Slf4jpublic class CylicBarrierExample { private final static CyclicBarrier CYLIC_BARRIER = new CyclicBarrier(5); public static void main(String[] args) throws Exception { for (

2022-03-19 15:48:04 203

原创 CountDownLatch

一、介绍CountDownLatch是一个并发工具类,它的作用是可以完成线程的协作,通常的场景是 主线程等待 多个子线程执行完成后再处理,类似于Jion功能。二、使用方法 public static void main(String[] args) throws Exception { // 设置挡板数量 final CountDownLatch latch = new CountDownLatch(10); for (int i = 0; i &l

2022-03-18 19:48:47 363

原创 Condition等待通知

一、介绍condition接口提供了类似Object的监视器的方法,用来实现等待通知模式。但是与Object监视器又有一定的区别,与不同。主要体现在;等待队列Obejct模式 :一个Condition:多个等待超时模式Object模式:不支持Condition模式:支持二、使用方法// 声明锁的对象ReentrantLock lock = new ReentrantLock();// 获取监视器Condition condition = lock.newConditi

2022-03-10 19:38:57 227

原创 ReentrantLock分析

一、介绍ReentrantLock是JUC包下的一个类,他是可重入锁,同一个线程可以对资源重复加锁。ReentrantLock而且支持公平和非公平的模式,公平模式下按等待时间来排队获取。也就是一个FIFO队列(synchronized 是隐式支持重入的)二、源码分析ReentrantLock 内部是通过组合的方式,实现自定义的同步同步器abstract static class Sync extends AbstractQueuedSynchronizer { private static

2022-03-09 23:13:16 209

原创 Volatile、锁、final内存语义

前言本文主内容 主要介绍关键字的 内存语义volatile的内存语义锁的内存语义finnal的内存语义一、Volatile1.1 Volatile的特性可见性: 对一个volatile变量的读,总是能看到任意线程对这个变量最后的写入原子性: 对任务单个volatile变量的读/写具有原子性(包括64位的long和double),但是volatile++ 这种操作不具备原子性;(仅仅是读写具备原子性)volatile读写内存语义:volatile读:当读一个volatile变量时,

2022-03-07 10:55:52 219

原创 JMM 内存模型

前言本文介绍java的内存模型java并发编程中,需要处理两个关键的问题:线程间的同步和通信一、什么是Java内存模型(JMM)在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。那么Java内存模型规定了哪些东西呢,它定义了程序中变量的访问规则,往大一点说是定义了程序执行的次序。(其实也就是在多线程情况下,对于共享可变变量,线程是如何通信的)

2022-03-07 10:37:26 125

原创 AbstractQueuedSynchronizer并发同步器

一、介绍队列同步器AbstractQueuedSynchronizer,是用来构建锁或其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源线程行排队工作。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。这时就需要同步器提供3个方法(getState(), setState(int newState), compareAndSetState(int expect, int update) )。因为它们能保证状态的改变是安全的。相

2022-03-06 16:36:00 286

原创 LinkedBlockingQueue

一.介绍LinkedBlockingQueue是JUC包下的一个类,见名大概也就能猜到,这是一个基于链表实现的阻塞的队列,这是一个线程安全的类。继承关系见如下:它的数据结构如下: static class Node<E> { E item; /** * One of: * - the real successor Node * - this Node, meaning the successor is.

2022-03-01 10:53:55 447

原创 Java-LinkedHashMap

一、介绍LinkedHashMap 继承 了 HashMap。LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。具有一定的顺序性。HashMap可以参考之前的文章:https://so.csdn.net/so/search?q=HashMap&t=blog&u=weixin_43732955public class LinkedHashMap<K,V&gt

2022-01-23 11:34:22 1455

原创 限流-RateLimter

一、什么是限流限流的目的是通过对并发访问进行限速,相关的策略一般是,一旦达到限制的速率,那么就会触发相应的限流行为二、实现方式2.1 计数器利用一个计数器 Count .当请求来时就加一操作,当一个请求处理完成之后 就减一操作。Count > 某个值时,触发限流策略。2.2 漏斗算法利用漏斗模型来控制,请求处理的流量;通常实现方式是通过一个队列来实现;当请求过多时,队列就会开始积压请求,如果队列满了,就会开拒绝请求。很多系统都有这样的设计,例如:TCP的请求,和滑动窗口。2.3 令牌

2022-01-16 17:43:39 643

原创 Guava的EventBus

一、用来干啥EventBus是Guava包内的一个 实现订阅/通知的一个组件,可以用来实现进程内的消息通知。(分布式系统要使用MQ消息队列进行通信)二、怎么做引入依赖: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>

2022-01-02 15:59:09 731

原创 服务器环境搭建

一、JDK1、rpm -qa |grep java2、rpm -qa | grep java | xargs rpm -e --nodeps3、yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 安jdk4、更改配置文件(根据自己的目录 配置相关环境变量)export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64export PATH

2021-12-27 11:09:14 827

原创 软件设计原则

编程不分高下,品味确不尽相同。软件设计的相关原则:一、Don’t Repeat Yourself (DRY)当在两个或多个地方发现一些相似代码的时候,我们需要把它们的共性抽象出来形成一个唯一的新方法,并且改变现有地方的代码让它们以一些合适的参数调用这个新的方法。二、Keep It Simple, Stupid(KISS)保持简单三、面向接口编程注重接口,而不是实现,依赖接口,而不是实现。接口是抽象是稳定的,实现则是多种多样的四、You Ain’t Gonna Need It (YAGNI) 过

2021-12-19 11:35:37 164

原创 Wireshark抓包tcp3次握手_ssl连接

一、介绍wireshark是一款抓包工具,可以自行官网下载,本片文章是抓取https连接的包,来学习tcp3次握手和tls1.2连接过程。二、基础知识复习2.1TCPtcp是传输层的一个协议,提供端之间的可靠传输,保障数据的 ,不乱,不丢,不错。而可靠传输之前就有经典的tcp3次握手了。(图片来源与网络)2.2 Https是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 [1] 。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全

2021-11-21 17:00:11 638

原创 MAT分析工具

一、MAT分析工具jvisualvm同样可以进行一键堆转储后,直接打开这个dump 查看。但是,jvisualvm 的堆转储分析功能并不是很强大,只能查看类使用内存的直方图,无法有效跟踪内存使用的引用关系。可以查看引用链二、排查思路:使用 MAT 分析 OOM 问题,一般可以按照以下思路进行:通过支配树功能或直方图功能查看消耗内存最大的类型,来分析内存泄露的大概原因;查看那些消耗内存最大的类型、详细的对象明细列表,以及它们的引用链,来定位内存泄露的具体点;配合查看对象属性的功能,可以脱离源码

2021-11-21 10:17:27 3123

原创 强软弱虚四种引用

一、强引用(StrongReference)1、平时我们编程的时候例如: Object object=new Object () ;那object就是一一个强引用了。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。​二、软引用(SoftReference)2、如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足

2021-11-07 12:14:38 74

原创 深入理解Tomcat

目录02 HTTP 必知必会03 Servlet容器04 Tomcat系统架构-连接器05 Tomcat系统架构-容器06 Tomcat请求过程流转07 Tomcat启动流程7.1 Catalina 组件7.2 Server 组件7.2 Service 组件7.3 Engine组件08 NioEndpoint组件:Tomcat如何实现非阻塞I/O?8.1 LimitLatch8.2 Acceptor8.3 Poller8.4 SocketProcessor8.5 Exector8.6 如何实现高并发09 T

2021-10-23 11:58:56 755

原创 K8s相关知识点

一、介绍1.1 k8s概述、特性概述:是谷歌在2014开源的一个容器化管理系统使k8s进行容器化部署使用ks8利用应用扩展k8s的目标实施让部署容器化应用更加简洁和高效特性:水平扩展、服务发现、滚动更新、版本回退、自动恢复、密钥配置和管理1.2 k8s架构组件主控节点 K8s Masterapi server 集群统一接口scheduler 节点调度,选择node进行应用部署controller-manager 处理集群中常规定时任务,一个资源对应一个定时任务etcd

2021-10-01 10:49:02 672

原创 数字加密、数字签名

一、什么是加密技术加密技术是最常用的安全保密手段,数据加密的关键在于加密算法和密钥管理。是一个明文变密文的过程。二、对称加密与非对称加密对称加密(私人密钥加密)特点:文件加密和解密使用的是相同的密钥;例如:DES、AES非对称加密(公钥加密):非对称加密的加密和解密需要两个密钥:公开密钥(Publickey)、私有密钥(privatekey);例如:RSA公钥加密只有私钥才能解密私钥加密只有公钥解密三、数字签名目的:完整性、身份认证、不可否认性发送方过程:1、单向散列函数

2021-08-08 11:41:27 1975

原创 ThreadLocal分析

问题:?Java的引用类型有哪几种?每种引用类型的特点是什么?每种引用类型的应用场景是什么?Threadlocal应用场景?ThreadLocal会产生内存泄漏?一、ThreadLocal用来干什么?目的为不同的线程创建一个变量副本;在多线程环境下可以访问对应的副本,也就是变量在不同的线程中是相互隔离的,是线程独享的二、引用的分类空间不够时,软引用指向的对象,在空间不够时会被回收,适合缓存;弱引用遭遇到GC就会被回收**虚引用的作用:**主要用来管理堆外内存。例如:当虚引用被回

2021-08-07 22:44:01 103

原创 SpringSecurity源码学习

SpringSecurity源码学习一、Spring-Boot的自动配置看到它的自动配置类:SecurityFilterAutoConfiguration @Bean @ConditionalOnBean(name = DEFAULT_FILTER_NAME) public DelegatingFilterProxyRegistrationBean securityFilterChainRegistration( SecurityProperties securityPropertie

2021-08-07 19:45:15 185

原创 SpringSecurity介绍及Demo

SpringSecurity介绍及Demo一、什么是SpringSecuritySpring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。**SpringSecurity 本质是一个过滤器链。**当中含有大量的过滤器。1.1 用户认证(Authentication)和用户授权(Authorization)这是安全框架最基本,也是最重要的两块东西。什么是认证?简答点说就是,告诉系统你是谁? 最基本的方式就输入账号、秘密登陆 这就是一个认证的过程

2021-08-07 19:44:34 1246 1

原创 深入理解java虚拟机脑图笔记

一、笔记图谱这是自己学习深入理解jvm虚拟机所整理的相关笔记 下面是部分截图,因为图片太大无法上传,文末会提供相关链接,有需要的自取脑图地址二、参考周志明《深入理解Java虚拟机》...

2021-08-07 19:38:33 122

原创 Pinple 和Handler 和 HandlerContext源码

Pinple 、Handler 、 HandlerContextChannelPipeline 、 ChannelHandler 、ChannelHandlerContext 这是netty中的核心组件,他们的关系如下:1、每当ServerSocket 创建一一个新的连接,就会创建一个Socket, 对应的就是目标客户端。2、每一个Socket都会分配一个Pipeline 也就是ChannelPipeline3、每个ChannelPipeline中有多个Context4、context之间会形成双

2021-05-23 17:44:27 413

原创 netty请求过程源码

natty 请求过程源码在之前的笔记中有记录netty的内部处理图:netty模型原理现在就在源码中找到这模型的基本实现:先介绍一下:EventLoop是一个死循环主要是循环处理3件事情:1、等待NIO事件发生 2、处理NIO事件 3、处理任务事件NioEventLoop代码如下: @Override // 部分代码节选.... protected void run() { int selectCnt = 0; // 这是一个死循环处理

2021-05-23 17:43:42 243

原创 netty启动过程源码

netty启动原理代码案例:/** * @author liuzihao * @create 2021-05-09-15:24 * netty客户端 */public class NettyServer { public static void main(String[] args) throws Exception{ /** * 创建两个线程组合 bossGroup workGroup 如上图所介绍 * bossGroup; 只

2021-05-23 17:43:01 142

深入理解java虚拟机脑图

适合java学习者

2021-08-07

空空如也

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

TA关注的人

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