自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

日有寸进

世上只有一种英雄主义,就是在认清生活真相之后依然热爱生活。

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

原创 Spring5 源码阅读笔记 (1.4)知识点汇总:解决循环依赖

什么是循环依赖?如下两段代码所示,Spring 在将 CircularRefA 实例化的时候需要注入 CircularRefB,因此会先实例化 CircularRefB。但实例化 CircularRefB 的时候又会发现需要先实例化 CircularRefA。实例化 CircularRefA 又得先实例化 CircularRefB …@Componentpublic class Circul...

2020-02-23 20:47:17 266

原创 详解MySQL中的事务(四种隔离级别、间隙锁等),看完还不懂你来打我

MySQL中的事务为什么需要事务什么存储引擎支持事务事务特性原子性一致性隔离性四种隔离级别Read Uncommitted(读取未提交内容)Read Committed(读取提交内容)Repeatable Read(可重复读)Serializable(可串行化)间隙锁(gap锁)持久性前置文章:MySQL存储引擎详解MySQL中的锁为什么需要事务现在的很多软件都是多用户,多程序,多线程的...

2019-09-20 11:52:26 1808 1

原创 JVM的类加载机制

JVM的类加载机制概述初始化概述类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。解析在某些时候可...

2019-09-16 11:17:46 200

原创 一文彻底搞清楚之JVM里最重要的垃圾回收算法与垃圾回收器

垃圾回收算法与垃圾回收器学习垃圾回收的意义如何判断对象的存活引用计数算法(JVM中没有使用)可达性分析算法(JVM中使用)关于finalize()四种引用(Reference)强引用(Strong Reference)软引用(Soft Reference)弱引用(Weak Reference)虚引用(Phantom Reference)垃圾回收算法标记-清除算法(Mark-Sweep)复制算法(C...

2019-09-05 20:58:06 391 2

原创 深入理解显式锁(Lock)和AQS(AbstractQueuedSynchronizer)(超详细)

显式锁和AQS显式锁Lock特性使用范式APIReentrantLock(可重入锁)锁的可重入锁的公平和非公平APICondition使用范式APILockSupportCLH(队列锁)显式锁Lock接口,实现类:ReentrantLock , ReentrantReadWriteLock.ReadLock , ReentrantReadWriteLock.WriteLock有了synch...

2019-08-04 12:18:34 1977 2

原创 走进Java里的线程世界

线程基础、线程之间的共享和协作基础概念什么是进程和线程CPU时间片轮转机制澄清并行和并发高并发编程的意义、好处和注意事项认识Java里的线程基础概念什么是进程和线程进程是程序运行资源分配的最小单位进程是操作系统进行资源分配的最小单位,其中资源包括:CPU、内存空间、磁盘IO等,同一进程中的多条线程共享该进程中的全部系统资源,而进程和进程之间是相互独立的。进程是具有一定独立功能的程序关于某...

2019-07-28 17:14:40 931 3

原创 ArrayList 面试题

1,初始容量大小?最大容量?A:10。Integer.MAX_VALUE。2,触发扩容机制?A:当调用 add 时,计算当前 size + 1,如果大于数组长度,扩容3,add 过程如果当前数组为空,创建容量为10的数组;如果size + 1 > length,扩容。赋值。public boolean add(E e) { //确保数组容量 ensureCapacityInternal(size + 1); // Increments modCount!! //赋值

2020-08-17 17:07:37 618 1

原创 MySQL 索引笔记

目录B TreeB+ Tree五种索引聚簇索引联合索引辅助索引覆盖索引用不到索引B TreeAVL Tree 的进化,一个 Node 上可以储存多个值,充分利用一个 Page 的内存大小(默认16 KB)。B+ TreeB Tree 的进化,增强了扫表能力,IO性能更好(非叶子节点没有放数据,能够放更多的指针),效率更稳定。五种索引普通索引:没有限制唯一索引:每行数据该列唯一,可以为 NULL,可以多个。主键索引:有且必有一个,不能为 NULL。联合索引:见下文。全文索引:用特殊的

2020-08-14 14:53:59 415

原创 拓扑排序

目录适用场景前提思路代码适用场景将图里的定点按照相连的性质进行排序排序结果应为:1 2 4 3 5前提必须是有向无环图思路不断找一个入度为 0 的点,放入结果集,再删除节点(更新入度表)。代码public class TopologicalSort { public static List<Integer> sort(boolean[][] adj, int[] indegree){ List<Integer> ans = new Link

2020-08-12 15:47:37 433

原创 为什么要重写 hashCode() 和 equals()

目录Object 的 hashCode() 与 equals()hashCodeequals重写 equals() 的场景String 的 equals()重写 hashCode() 的场景Object 的 hashCode() 与 equals()hashCodepublic native int hashCode();原生的 hashCode() 是一个本地方法,返回的是根据物理地址换算出来的一个唯一值。equalspublic boolean equals(Object obj) {

2020-07-19 17:47:06 284

原创 关于 String、StringBuffer、StringBuilder 的常见面试题

目录String创建方式一方式二方式三最大长度拼接方式一方式二StringBuilderappendtoStringStringBuffertoStringString类不可变(final),内部维护的 char[] value 数组不可变(final)。创建方式一String str = "xxx";字符串常量池如果有 “xxx”,不创建对象;如果没有,在字符串常量池创建"xxx"。方式二String str = new String("xxx");字符串常量池如果有 “xxx”,创

2020-07-19 16:45:15 686

原创 Docker 面试题

目录DockerDocker镜像Docker容器Docker仓库Docker与虚拟机有何不同Docker的工作原理Docker容器的几种状态DockerDocker是一个容器化平台,它以容器的形式将应用程序及其所有依赖项打包在一起,以确保应用程序在任何环境中运行。Docker镜像Docker 镜像是 Docker 容器的只读模板,用于创建容器。Docker容器Docker容器包括应用程序及其所有依赖项,但与其他容器共享内核,作为主机操作系统上用户空间中的独立进程运行。Docker容器不依赖于任何

2020-07-19 11:48:09 4644

原创 Eureka 的多级缓存设计

目录三种缓存三种缓存Eureka Server 存在三个变量:registry、readWriteCacheMap、readOnlyCacheMap 保存服务注册信息。类 AbstractInstanceRegistryprivate final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry = new ConcurrentHashMap<

2020-07-18 18:17:55 2249

原创 SpringBoot 整合 Mybatis 源码阅读(2.3.1.RELEASE)

目录从 spring.factories 开始MybatisAutoConfiguration@MapperScanMapperScannerRegistrarrefreshinvokeBeanFactoryPostProcessorsConfigurationClassPostProcessor从 spring.factories 开始导入依赖 mybatis-spring-boot-starter 后,会出现如图所示这么一个包,主要看 MybatisAutoConfigurationMybati

2020-07-14 10:02:41 508

原创 EurekaClient 服务注册流程

服务注册的入口 这篇文章最后一段代码@Overridepublic void start() { // only set the port if the nonSecurePort or securePort is 0 and this.port != 0 if (this.port.get() != 0) { if (this.registration.getNonSecurePort() == 0) { this.registration.setNonSecurePort(this.p

2020-07-12 16:54:01 1442

原创 服务注册的入口

目录接口服务注册的触发路径接口SpringCloud 是一个生态,它提供了一套标准,这套标准可以通过不同的组件来实现,其中就包含服务注册/发现、熔断、负载均衡等,在 spring-cloud-commons 这个包中, org. springframework. cloud. client. serviceregistry路径下,可以看到个服务注册的接口定义 ServiceReglstry。它就是定义了 SpringCloud 中服务注册的一个接口。public interface Servi

2020-07-12 14:34:17 428

原创 Spring5 源码阅读笔记(1.5)finishRefresh() 完成刷新

protected void finishRefresh() { //清空上下文级别的资源缓存 clearResourceCaches(); //初始化上下文的LifecycleProcessor 见1.5.1 initLifecycleProcessor(); //调用所有LifeCycle的start方法 见1.5.2 getLifecycleProcessor().onRefresh(); //发布ContextRefreshedEvent publishEvent(new Co

2020-07-12 11:26:54 298

原创 Eureka 自我保护机制

什么是自我机制?自我保护机制是一种应对网络异常的安全保护措施。它的架构哲学是宁可保留不健康的微服务,也不轻易注销健康的微服务。Eureka在运行期间会统计全部服务总体的心跳失败的比例,在15分钟内是否低于85%。如果低于,则认为是网络异常问题,应该保护,Eureka Server会将当前的实例注册信息保护起来,同时提示一个警告。一旦进入保护模式:Eureka Server将会不再删除服务注册表中的数据。也就是不会注销任何微服务。Eureka server仍然能够接受新服务的注册和查询请求,但是不

2020-07-11 20:54:30 761

原创 push 和 pull 的优缺点

push 和 pull 的优缺点push优点缺点适用场景优化pull优点缺点优化方案适用场景push优点生产者主动推送给消费者,及时性很高缺点当消费者消费能力远低于生产者生产能力,那么一旦生产者推送大量消息到消费者时,就会导致消费者消息堆积,处理缓慢,甚至服务崩溃。(那么如何解决这个问题呢?需要mq提供流控制,也就是依据消费者消费能力做流控。比如rabbitmq设置Qos,限制消费数量。)生产者需要维护和每个消费者之间的会话。适用场景对于数据实时性要求高的场景优化不采用

2020-07-09 16:44:50 5233

原创 Netty 源码阅读笔记(4) ServerBootStrap

目录类关系图4 bind4.1 initAndRegister4.1.1 newChannel4.1.2 init4.1.2.1 ServerBootstrapAcceptor类关系图4 bind类 AbstractBootstrappublic ChannelFuture bind() { validate(); SocketAddress localAddress = this.localAddress; if (localAddress == null) {

2020-07-05 17:34:28 284

原创 Netty 源码阅读笔记(5) NioServerSocketChannel

目录类关系图5.1 构造方法类关系图5.1 构造方法public NioServerSocketChannel() { this(newSocket(DEFAULT_SELECTOR_PROVIDER));}public NioServerSocketChannel(ServerSocketChannel channel) { //注册接收事件 super(null, channel, SelectionKey.OP_ACCEPT); config = ne

2020-07-04 21:03:56 242

原创 Netty 源码阅读笔记(6) DefaultChannelPipeline

目录类关系图6.1 构造方法6.1.1 TailContext6.1.2 HeadContext类关系图6.1 构造方法protected DefaultChannelPipeline(Channel channel) { this.channel = ObjectUtil.checkNotNull(channel, "channel"); succeededFuture = new SucceededChannelFuture(channel, null); voidPro

2020-07-04 21:01:34 339

原创 Netty 源码阅读笔记(1) NioEventLoopGroup

目录类结构图1.1 构造方法1.1.1 newChild类结构图1.1 构造方法public NioEventLoopGroup() { this(0);}public NioEventLoopGroup(int nThreads) { this(nThreads, (Executor) null);}public NioEventLoopGroup(int nThreads, Executor executor) { this(nThreads, executo

2020-07-04 19:39:18 336 2

原创 Netty 源码阅读笔记(3) NioEventLoop

目录类关系图3.1 构造方法3.2 run3.2.1 select3.2.2 processSelectedKeys类关系图3.1 构造方法NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider, SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler)

2020-07-04 19:33:51 252

原创 Netty 源码阅读笔记(2)ThreadPerTaskExecutor

public final class ThreadPerTaskExecutor implements Executor { private final ThreadFactory threadFactory; public ThreadPerTaskExecutor(ThreadFactory threadFactory) { if (threadFactory == null) { throw new NullPointerException("

2020-07-04 15:32:46 480

原创 基于 SpringBoot 手写 RPC 框架

目录文件目录Messageconsumer@EnableRpcConsumer@ReferenceReferenceInvokeProxyRpcHandlerprovider@EnableRpcProvider@ServiceBeanMethodInitialMediatorMediatorServiceHandlerSocketServerInitial示例consumer启动类配置文件TestControllerprovider启动类配置文件ExampleServiceImpl结果文件目录Mess

2020-06-20 11:46:48 1458

原创 序列化相关面试题

1.如果一个子类实现了序列化,父类没有实现,那么父类中的成员变量能否被序列化?不会。2.transient是干嘛的?有什么方法能够绕过transient的机制?这个实现机制的原理是什么?transient是干嘛的?transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化(Java 的序列化方式)到文件中,在被反序列化后,transient 变量的值被设为初始值。有什么方法能够绕过transient的机制?虽然 name 被 transient 修饰,但

2020-06-16 16:05:47 996

原创 如何选择线程池最优线程数

目录任务分类公式公式一公式二对比联想CPU密集型IO密集型任务分类我们一般用一个线程池做同一种类型的任务,而不是把各种类型的任务都丢进同一个线程池执行。而任务可以分成2种类型:CPU 密集型、IO密集型。公式先来看看2个公式,这两个公式适用任何一种类型。公式一Nthreads = Ncpu x Ucpu x (1 + W/C)其中:Ncpu = CPU的核心数量Ucpu = CPU的使用率, 0 <= Ucpu <= 1W/C = 等待时间与计算时间的比率注意: Inte

2020-06-12 16:51:22 1312

原创 什么是 RESTful ?

目录约束Representational State TransferResourcesRepresentationalState Transfer约束前后端分离出现后,后端提供给前端的 API 应该如何设计成则便于理解、容易使用的,成了一个问题。而所谓的 RESTful 就是用来规范后端提供的 API 的一种约束。Representational State TransferRESTful,意思是 REST 风格的。REST 是 Representational State Transfer 的

2020-06-10 10:13:17 512

原创 面试题:NIO/Netty 中的零拷贝体现在哪里?

目录DirectByteBuffer 与 HeapByteBuffer 的关系面试题:NIO 的零拷贝体现在哪里?关于 Java 里的 IO 这一块,相关代码大量调用了 JNI(Java Native Interface),JNI 是由 c/c++ 写的。而这些底层语言关于 IO 这一块,调用的是“系统调用”,“系统调用”是系统提供的接口。DirectByteBuffer 与 HeapByteBuffer 的关系我们创建一个 DirectByteBuffer:类 ByteBufferpublic

2020-06-06 08:54:39 572

原创 门面模式

门面模式( Facade Pattern)又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接口特征:门面模式定义了一个高层接口,让子系统更容易使用属于结构型模式与代理模式的区别从实现上看,其实就是一种静态代理。但是它的重点在于封装与对外展示。而静态代理,重点在于增强。学设计模式,要看思想,不能只看代码。与单例模式的关系门面模式经常做成单例模式,比如各种工具类。优点1、简化了调用过程,无需深入了解子系统,以防给子系统带来风险2、减少系统依赖、松散耦合(对客户端而言)3、

2020-06-04 16:48:12 191

原创 Redis Cluster 集群原理

简介Redis Cluster 是 Redis3.0 版本后推出的分布式解决方案,当遇到单机内存、并发等瓶颈时,可使用此方案来解决。和 主从模式 和 哨兵模式 不同的是:主从模式和哨兵模式只能保证高可用,每一台机器存储的内容是相同的。Cluster 能够让 Redis 存储更多的内容,集群里 master 之间的内容是不同的。另外每一个 master 还可以配置自己的 slave 达到高可用分区规则Redis Cluste r采用了哈希分区的“虚拟槽分区”方式所有的键根据哈希函数 (CRC

2020-06-03 08:42:29 144

原创 System.exit(0) 与 System.exit(1) 在运行上有何区别

疑问看到很多博客上说,System.exit(status) ,status 为 0 就是正常退出,status 为 1 是非正常退出。真的是这样吗?代码测试public class Test { public static void main(String[] args) { try{ throw new RuntimeException(); }catch (Exception e){ System.exit

2020-06-01 09:16:45 386

原创 常见面试题:交换 Integer

目录代码知识点值传递与引用传递Integer 的 value 和 IntegerCachevalueIntegerCache反射图解代码import java.lang.reflect.Field;public class Test { public static void main(String[] args) throws Exception { Integer a = 1, b = 2; swap(a ,b); System.out.pr

2020-05-29 21:53:40 200

原创 MySQL 主从复制架构

目录主从复制结构Replication 机制配置MySQL 的 Docker 安装分别配置 my.conf主从登录 MySQL主赋权限查看日志文件位置和位置从设置主机启动 IO 进程和 SQL 进程查看进程信息主从验证主从复制结构在实际应用场景中,MySQL 复制 90% 以上都是一个 Master 复制到一个或者多个Slave 的架构模式缺点:1、master不能停机,停机就不能接收写请求2、slave过多会出现延迟Replication 机制配置不用 Docker 也行,分别在两台虚

2020-05-29 12:49:18 266

原创 CentOS7 下 Docker 安装

卸载yum list installed | grep docker查询到相关的,通通用以下方式卸载yum -y remove docker-engine.x86_64cd /etc/yum.repos.d/删除 docker.repo 等与 docker 有关的安装cd /etc/yum.repos.d/wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum clean all &&a

2020-05-24 14:15:54 228

原创 分布式事务之 LCN 框架实现方案的原理、配置与使用

目录LCN 原理背景框架定位事务控制原理原理图配置依赖配置启动类配置使用服务提供方服务发现方TCC 原理思想原理图使用服务提供方LCN 原理背景LCN 名称是由早期版本的 LCN 框架命名,在设计框架之初的1.0~2.0的版本时框架设计的步骤是如下,各取其首字母得来的 LCN 命名。锁定事务单元(Lock)确认事务模块状态( Confirm)通知事务( Notify)框架定位LCN 并不生产事务,LCN 只是本地事务的协调工。TX-LCN 定位于一款事务协调性框架,框架其本身并不操作事

2020-05-20 13:17:04 1048

原创 开发必备:MD5 加密工具、非空判断工具

目录MD5 加密工具非空判断工具MD5 加密工具public class MD5Util { public static String encrypt(String source) { return encodeMd5(source.getBytes()); } private static String encodeMd5(byte[] source) { try { return encodeHex(MessageD

2020-05-10 15:38:52 193

原创 开发必备:响应封装、异常封装、异常捕获

目录整合 fastjson响应封装异常封装Service 层业务异常数据异常Controller 层参数验证异常异常捕获整合 fastjson让返回的 json 更漂亮SpringBoot 整合 fastjson响应封装@Datapublic final class BaseResponseVO<M> { private BaseResponseVO(){} // 返回状态【0-成功,1-业务失败,999-表示系统异常】 private int statu

2020-05-10 13:25:07 352 2

原创 SpringBoot 整合 fastjson

依赖配置<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.56</version></dependency>配置类配置@Configuration("defaultFastjsonConfig")@ConditionalOnClass(com.al

2020-05-10 12:43:25 485

mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz

Linux 使用的版本是centos 7,为方便起见,先把防火墙关闭,配置好网络,在安装部分,会分成两部分讲,首先讲单实例安装,也就是一台服务器上就装一个mysql,接下来就多实例安装,在一个服务器上安装2个甚至多个mysql.

2019-09-17

空空如也

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

TA关注的人

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