自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 互联网金融基础知识--数字货币

认知创造价值。

2022-09-12 22:22:05 3690 1

原创 kafka消费者源码

kafka-consumer

2022-06-04 15:27:11 527

原创 kafka-producer初始化流程图及源码

kafka源码和运行流程图

2022-06-04 14:27:09 685

原创 SpringClouHystrix运行流程及源码

断路器作用:熔断、隔离和降级熔断:本质是对原子Boolean的判断和properties中的一堆阈值判断隔离:通过线程池和信号量实现目标为服务调用之间的互不干扰,map降级:目标服务器嘎嘣儿了或网络IO超时了,从定义的fallback静态缓存中获取返回数据,就是出错了,别整那么难看,保证后端服务不要大面积受到影响而瘫痪源码按照三部分来分析:配置、执行、关闭第一部分源码:断路器的自动装配自动装配是springboot中的基础知识,我之前的文章中有想学习的执行流程@Configuration(p

2022-05-21 16:31:10 274

原创 SpringCloudFeign的注册流程和源码

微服务的访问可使用restTemplate,也可以使用feign远程调用,feign默认使用ribbon实现负载均衡声明式的伪Http客户端,整合了feign和Hystrix,big和eureka结合,可实现负载均衡和断路器等功能自动装配FeignAutoConfiguration的时候,会创建Targeter 配置Bean,默认使用 HystrixTargeter实现断路器@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@

2022-05-20 14:19:10 483

原创 SpringCloudRibbon运行原理和源码

ribbon的源码比较简单,打个debug走一遍基本就明白了.ribbon是客户端负载均衡器,即自己在最终调用前,自己通过一些规则来确定调用某一个实例。ribbon维护了服务器实例信息列表,并定期刷新本地ServerList,而后通过某些逻辑Role来实现负载均衡调用...

2022-05-19 19:29:56 157

原创 SpringCloudEureka服务下线和剔除流程及源码

服务下线```java/** * @Description: 服务下线 * @Author: PABLO * @Date: 2022/5/18 15:27 * @Params: [appName, id, isReplication] * @Return: boolean **/ protected boolean internalCancel(String appName, String id, boolean isReplica

2022-05-18 16:27:54 551

原创 SpringCloudEureka服务续约流程及源码

源码@PUTpublic Response renewLease( @HeaderParam(PeerEurekaNode.HEADER_REPLICATION) String isReplication, @QueryParam("overriddenstatus") String overriddenStatus, @QueryParam("status") String status, @QueryParam("lastDir...

2022-05-18 15:20:32 132

原创 SpringCloudEureka服务注册流程图及源码

@EnableEurekaServer是个开关实现原理:eureka的实现原理是基于Jersey框架过滤器拦截,节点间的通信采用HTTP,服务器接受请求后,拦截request,获取对应的执行操作调用不同的处理逻辑。核心源码 @POST @Consumes({"application/json", "application/xml"}) public Response addInstance(InstanceInfo info,

2022-05-18 15:16:47 335

原创 Springboot内置Tomcat运行流程图及源码

调用流程refresh,这里其实是spring的核心代码这里这是模板方法,看子类实现AutoConfiguration有一个ServletWebServerFactoryAutoConfiguration会被加载进来(细节在我的SpringBoot自动装配中有)所以才会获得tomcat对应的工厂。进入getWebServer(),有多种实现细节的创建 private void createWebServer() { //首次进来空的 .

2022-05-16 23:55:40 632

原创 Springboot自动装配流程图及源码

流程总结两大部分:prepareContext + refreshContext1.prepareContext1.1 load方法,将启动类封装为beanDefinition注册到bedefinitionMap2.refreshContext2.1 invokeBeanFactoryPostProcessor2.1.1 parse方法,递归扫描启动类上注解,确定basePackage,加载构件注解修饰的类2.1.2 扫描解析@Import 将需要自动装配的class信息加载,最终注册到bea.

2022-05-16 14:40:59 1043

原创 SpringBoot启动流程及源码

SpringBoot的启动流程可以分为几大部分:1.创建SpringApplication,加载监听器2.启动监听器3.创建创建环境4.创建容器5.将环境放入容器中6.refresh容器7.启动所有监听器第一部分:创建SpringApplication构建好SpringApplication执行run()这里是启动的伪代码 public ConfigurableApplicationContext run(String... args) { //记录开.

2022-05-15 13:30:31 392

原创 Spring循环依赖流程图及源码

缓存没有现成的,所以createBean此时会再走一遍getBean接下来看我画的流程图就可以了

2022-05-13 00:55:53 151

原创 手写4不润v2源码

类图(手写版类图是原版迷你版)手写版Spring启动流程图手写版调用流程图项目结构图代码: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM

2022-05-10 15:22:31 336

原创 手写简易版Springv1源码

v1版本目录结构类图注解@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface PABLO_Autowired { String value() default "";}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface

2022-05-07 22:28:19 287

原创 手写简易版spring-mvc源码

1.0手写版,后续会继续更新web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com

2022-05-04 19:26:54 632

原创 分库分表Sharding-Sphere

宝子们,之前工作弄过分库分表,正巧最近有点时间,就简单回顾整理一下,版本更新虽然快,但本质不变,简单整理下Sharding-sphere。分库分表主要解决数据量大带来的性能问题,分为垂直/水平两维度,每个都可运用在分库分表上。1.垂直,结构不同1. 垂直分表如以表字段拆分,本质还是两个独立的表,只是在业务中是一类,如商品,可分为商品基本表+详情两表场景很多,如电商商品表可分为若干表,首页是商品名称等基本信息,此时只需查询基本信息表即可满足用户浏览,如点击详情后,在继续查询详情信息,本质都是商品相

2022-04-30 23:16:48 1025 2

原创 手写超简易版mybatis源码

mybatis手写简易版

2022-04-26 23:16:14 439

原创 加密和解密

通信安全问题:窃听,假冒,篡改,抵赖窃听:加密解决(但无法根本解决中间人攻击)假冒:数字证书或消息认证码篡改:数字证书或消息认证码抵赖:数字证书对称加密速度快,存在密钥分配问题非对称加密加密速度较慢,存在窃听问题,相对安全混合加密:(对称+非对称)要点:大量传输使用对称加密,速度快非对称密钥 加密 对称加密的密钥仍存在中间人攻击如何解决呢?信息认证码或数字证书什么是哈希值?可以将哈希想象成搅拌机,出来的都是16位无规律的信息摘要哈希函数特点:哈希值长度固定,和传入数据长度无关

2021-07-13 18:41:30 271

原创 IO模型和epoll原理

传统BIO为阻塞IO,来张图:BIO 一个线程处理一个连接,如果建立连接不发送数据,就会一直阻塞,即使是多个线程处理多个服务也是阻塞的,两个阻塞点:等待链接。等待输入。线程Thread是操作系统的轻量级进程,BIO每个连接进来都创建线程与之对应,是如何操作的呢?每连接一个操作系统会调用内核的clone方法将连接好的线程copy一份,该线程会有对应的线程ID号,建立监听。有对应的日志,新开辟的线程可以recv(读取客户端信息),然后主线程继续等待连接,以此类推。主线程循环继续阻塞等待连接,随着客户端连

2021-05-28 16:03:34 249

原创 网络通信协议和层级关系应用

网络通信是我们交换数据的行为,既然是通信就要有规则,如你给我打电话,但是我告诉你停机了的手机号或者别人的手机号,你一定找不到我,所以需要制定一些规则来约束你我之间的通信,才能更好的交流,这就是协议。TCP/IP五层模型分别是:应用层,运输层,网络层,数据链路层,物理层这五层我们可以理解为代项目中的层级调用,每层制自己的事情,并且层级之间有依赖关系,相辅相成。我们来说一下每一层的作用。应用层:定义协议,如http ftp等,定义了通信的基本规则运输层:即传输控制层TCP/UDP协议为什么

2021-05-14 13:55:18 544

原创 计算机知识

高级语言是针对汇编语言的,汇编语言可以理解为计算机机器语言,所以我们的代码都会被解释成汇编指令,而后交给计算机执行。高级语言==》编译器(解释器)==》机器语言cpu和内存是计算机的核心,内存存放指令,cpu通过总线逐条执行,不断的运算返回,取完为止。cpu的相比内存来说非常快,所以cpu在内存读取指令的时候可以是并行的,这样会引发数据并发安全问题,缓存一致性协议保证多核心里的缓存行数据一致性问题,总线锁是最后保障。MESI做不到实时,volatile可以保证其他cpu马上读取新数据,volatil

2021-05-12 10:39:36 141

原创 AQS加锁过程

ReentrantLock早期是因为synchronized太重而产生的锁,synchronized作为传统基础锁,后期经过改进,性能有很大改善,reentrantLock结合了CAS+自旋+AQS+volatile+park等,CAS和volatile的原理知识我前面的文章总结过,今天说一下AQS(后续总结还会更新到此文档,毕竟源码很头疼)。首先说明几点:1:持有锁的线程永远不再等待队列中2:reentrantlock修改的是AQS对象的锁状态,并且该状态和线程绑定,Synchronized修改的是

2021-05-04 23:02:36 552

原创 volatile底层实现

volatile可以保证多线程数据可见性和指令重排序之前的文章我写了怎么使用,今天聊聊原理。首先说一下cpu乱序执行什么意思呢?即cpu并没有按照指定的指令顺序操作,cpu乱序执行提高了效率,相当于异步操作,如果多个cpu操作互相之间没有关联,是最理想的,但如果cpu之间操作的指令是关联的,并且没有按照理想的顺序操作,就会出现问题(指令重排序),cpu的速度比内存快很多。什么是有关联的指令呢?如创建对象的过程:一个小例子证明cpu乱序执行我们的代码是从上到下的顺序解释执行,解释成汇编码,然后J

2021-04-30 14:34:21 354 1

原创 synchronized原理和锁膨胀

synchronized是java经典锁,也是一把比较重的锁,后期针对锁机制进行了改进。首先说一下synchronized最底层实现的是一条汇编指令 lock cmpxchg,cmpxchg不具备原子性,在多cpu下线程不安全,lock指令可以锁定北桥信号,可以使得每个cpu在进行操作的时候不被打断。先从网上拽张图,这里只体现了对象头markword中锁信息,markword中还包含GC标记,hashcode等,我之前的文章有体现。对象在堆内存中的布局用户态和内核态很早期的操作系统不区分内核态

2021-04-28 21:25:23 378

原创 ThreadLocal

线程本地对象,方法调用中,一个线程贯穿多个方法运行,那么如何保证该线程在调用链路中的数据一致性呢?解决方案:1.一层层传参数(不现实,框架不支持,也繁琐)2.静态static ,是可以达到全局访问,但是,线程不安全,大家都可以操作3.ThreadLocal来实现。ThreadLocal解决多线程访问的数据安全问题,是维护线程中的变量不被其他线程干扰而出现的结构。画张图:ThreadLocal的set方法每个线程Thread里都有一个ThreadLocalMap集合,该集合是ThreadL

2021-04-27 21:41:06 1588

原创 CountDownLacth

倒计时锁存器,如果我们A业务必须等到B业务执行完毕后才可以执行,那么可以用到CountDownLatch来实现。工作流程:设置门闩值,每调用一次countDown方法,该值-1,为0时await方法停止阻塞继续执行。如下图,值为100,调用了99次,线程一直在阻塞,执行不到下面的任务使程序倒计时为0,下面的程序正常执行...

2021-04-26 17:44:59 444

原创 线程并发之exchanger

Exchanger是Java5之后推出的工作线程交换数据的,工作流程如下:线程1和线程2交换数据,线程1拿出数据阻塞,等待第二个线程拿出,然后交换。代码实现:场景用在哪里呢?我觉得可以用在交换装备上。...

2021-04-26 16:19:51 134

原创 Semaphore

Semaphore 可实现限流,最多允许多少线程同时运行限制线程访问,如停车场有10个车位即Semaphore semaphore = new Semaphore(10);进来一辆车(线程),调用acquire方法,如果该线程调用release方法(开走了),释放锁(释放车位)依此类推,如果车位满了(线程为10),外面的线程等待(等车位),等待分为公平等待和非公平等待(公平锁和非公平锁,可在构造方法设置)例:package com.example.demo;import java.util.c

2021-04-26 10:39:17 271

原创 ReadWriteLock

读写锁是数据读写同时访问的优化,其集成了读锁和写锁,同一对象可以做到灵活控制读写锁的特点:排他锁(写锁)和共享锁(读锁)的结合。首先写一个例子,利用reentrant lock来实现读写共同访问的例子,会导致排他而降低效率,后面的线程必须等到前一个线程释放才可以,尽管前面是读操作。package com.example.demo;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLo

2021-04-25 20:29:03 99

原创 多线程之阶段运行———CyclicBarrier

此为java1.7之后对多线程进行分批处理的API如:n个线程访问,从中截取m个线程为一组(构造参数设置)进行对应操作,如果该组线程不够,那么集体等待。package com.hezhanghuaixiao.apipaaenger.learn;import java.util.concurrent.CyclicBarrier;/** * @author 何章怀晓 hezhanghuaixiao * @version V1.0 * @desc */public class Test042

2021-04-24 20:03:36 127

原创 多线程之阶段运行———Phaser

场景:n个线程但是需要分阶段执行,并且每个阶段是符合一定条件的,以小组为单位,必须该阶段该小组的所有线程都完成了任务,才可以进行下一步任务。我模拟了一个学习的阶段任务小程序:package com.hezhanghuaixiao.apipaaenger.learn;import java.time.Period;import java.util.Random;import java.util.concurrent.Phaser;/** * @author 何章怀晓 hezhanghuaix

2021-04-24 19:56:46 193

原创 可重入锁

可重入锁即我调用加锁方法,该方法又调用了另一个加锁方法,相当于锁了两次(N次),但是不会出现死锁。synchronized和reentrantLock是可重入锁先说下sync:必须是同一个线程,同一把锁才可以。例子:新建线程访问m1,m1打印后调用m2,两方法均锁定当前对象,并且均为同一线程,所以两方法可同时运行——————————————————————————————————其他例子1:如果不是同一个线程访问 m2阻塞其他例子2:如加锁和未加锁同时运行,不会阻塞其他例子3:锁

2021-04-24 15:55:11 158 1

原创 原子操作之long++

package com.example.demo;import java.util.concurrent.atomic.AtomicLong;import java.util.concurrent.atomic.LongAdder;public class Test0423LongAdder { static long a = 0; static AtomicLong b = new AtomicLong(0); static LongAdder c = new Lon.

2021-04-23 18:32:53 361

原创 CAS

之前写过关于CAS的文章,今天在总结一下CAS工作原理:比较并交换,通过自旋+比较来完成原子性操作工作流程:线程A将堆内存数据copy到自己的工作内存,将其修改写回时将自己工作内存值和堆内存值做比较,一致则完成替换,否则读取堆内存新值,反复操作。来个图:CAS问题:ABA==》版本号,atomic中有对应操作API,有版本的,有返回boolean值的只能保证一个共享变量的原子性(Atomic类库中将主内存所有的共享变量统一管理)cpu消耗——————————小例子:通过原子类库完成

2021-04-23 17:41:50 178

原创 volatile

volatile可以保证数据在线程间的可见性,例如我们可以用boolean来控制循环,多个线程之间的数据共享。作用:1.线程间数据可见性2.禁止指令重排序写一个小例子说明线程可见性:这里线程可能会一直执行,即使下面线程修改了boo为false,但是线程之间不一定可见(为什么这么说呢?首先堆内存值boo,每个线程对其操作都会copy一份到自己的工作内存中,如果主内存值被修改,其他线程如果空闲可能会去读取一遍,但是也可能不去读取,即使读取了,也有延时。)加上volatile关键字可以在修改主内存

2021-04-23 16:53:18 166

原创 线程的几个方法

进程的最小执行单元,一个程序中不同的执行路径,就是多个线程。方法调用和线程调用:run方法级别调用:调用run,本方法和run方法是同一个线程start方法线程级别调用本地方法继续执行,同时会产生一个分支线程来执行start(线程中的run方法)start方法最终会调用run方法,start调用操作系统创建线程,然后由操作系统启动,状态为RUNNABLE,然后回调我们重写的run方法。线程是cpu调度的,cpu没有线程的概念,自身是死循环,不断的从内存中获取指令然后运行,没有就歇着。方法1:

2021-04-22 15:47:38 779

原创 Synchronized异常释放锁

synchronized锁解决了多线程访问的数据安全问题,但是如果线程A在执行的时候出现异常,那么此时等待队列中的就绪线程会不会执行同步块中的数据呢?static class Test0422SyncExc{ static int a = 0; public synchronized static void add() throws Exception { for (;;) { a++;

2021-04-22 14:33:26 663

原创 synchronized锁对象

synchronized锁的是对象大家都知道,今天写一个小例子测试一下,如果锁的不是同一个对象,锁一定会失效。场景1:Synchronized和非synchronized方法可以同时运行,如果在sync执行时间长,而此时同一个对象又调用了非sync方法,就会出现脏读读锁未加,读线程在写线程未完成的情况下就插入执行,此时数据脏读。解决:加读锁,此时锁住同一个对象,读写互斥。场景2:如何确定是锁定是统一对象?我们来测试一下,新建对象读取,此时是加了读写锁的,但是仍锁不住。关于锁还有很多,后

2021-04-22 11:29:01 799

原创 对象在内存中的布局

对象在内存中包括四部分:markword。前8字节 对象头。存储对象运行时数据{ 哈希吗,GC分代年龄,锁信息(锁状态 标示,线程持有的锁,偏向线程ID,偏向线程时间戳) }classpoint 类指针 4字节 对象头。 指向元数据-----------如果是数组,对象头还有第三个==》记录数组长度的数据instance data 实例数据 实例数据padding 对齐 对齐填充。8字节整数的倍数例子:加锁会修改对象头里的markword,锁释放后会回到之前状态

2021-04-21 17:58:54 149

空空如也

空空如也

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

TA关注的人

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