<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[crazyjack1的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/crazyjack1</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; crazyjack1]]></copyright><item><title><![CDATA[JAVA线程池必知必会]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/123077957</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/123077957</guid><author>crazyjack1</author><pubDate>Tue, 22 Feb 2022 21:37:12 +0800</pubDate><description><![CDATA[J.U.C提供的线程池：ThreadPoolExecutor类，帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池，是一个开发人员必修的基本功。]]></description><category></category></item><item><title><![CDATA[InnoDB存储引擎架构及特性总结篇]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/121781297</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/121781297</guid><author>crazyjack1</author><pubDate>Wed, 08 Dec 2021 09:45:00 +0800</pubDate><description><![CDATA[InnoDB是是一个事务安全的MySQL存储引擎，这是它与MyIsAM的最大区别，也已经成为了MySQL的默认存储引擎。InnoDB存储由许多的后台线程，内存池以及文件构成]]></description><category></category></item><item><title><![CDATA[MySql单表过大水平分表实践从技术选型到方案代码落地]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/121730100</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/121730100</guid><author>crazyjack1</author><pubDate>Sun, 05 Dec 2021 15:26:33 +0800</pubDate><description><![CDATA[水平拆分表就是按照表中的记录进行分片，那么具体应该怎么进行拆分，涉及到数据归并要怎么进行处理，原来的join语句还能用吗？]]></description><category></category></item><item><title><![CDATA[数据库分库分表主键生成策略SNOWFLAKE]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/121641380</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/121641380</guid><author>crazyjack1</author><pubDate>Tue, 30 Nov 2021 20:12:36 +0800</pubDate><description><![CDATA[分表的时候，如何去设计全局唯一的主键ID。全局唯一 ID 几乎是所有设计系统时都会遇到的，它在存储和检索中有至关重要的作用]]></description><category></category></item><item><title><![CDATA[Java动态代理（JDK动态代理和cglib）]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/121527691</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/121527691</guid><author>crazyjack1</author><pubDate>Wed, 24 Nov 2021 23:26:01 +0800</pubDate><description><![CDATA[JDK动态代理
JDK的动态代理只允许代理接口
重要的类和接口Proxy和InvocationHandler
Proxy.newProxyInstance(ClassLoader loader, Class&lt;?&gt;[] interfaces,InvocationHandler h)方法创建目标对象的代理对象
获取到目标对象的代理对象之后，执行目标对象的方法实际上是通过调用代理对象的invoke方法实现的
我们可以在invoke方法中增加额外的通用的逻辑来对目标对象进行增强
/**
 * @Desc]]></description><category></category></item><item><title><![CDATA[一文搞懂RPC流程架构，与Restful区别]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/121527597</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/121527597</guid><author>crazyjack1</author><pubDate>Wed, 24 Nov 2021 23:21:00 +0800</pubDate><description><![CDATA[1、什么是RPC？
RPC（Remote Procedure Call），远程过程调用，是一种通过网络从远程计算机程序上请求服务，而不需要了解底层网络技术的协议。通俗地讲，就是开发者能够像调用本地方法一样调用远程的服务。RPC的作用主要体现在两个方面：

屏蔽远程调用跟本地调用的区别，让我们感觉就是调用项目内的方法；
隐藏底层网络通信的复杂性，让我们更专注于业务逻辑。

两个或多个应用程序都分布在不同的服务器上，它们之间的调用都像是本地方法调用一样。比较知名开源的RPC框架有阿里的Dubbo、google的]]></description><category></category></item><item><title><![CDATA[SpringBoot启动过程分析——启动过程源码分析]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/121199589</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/121199589</guid><author>crazyjack1</author><pubDate>Sun, 07 Nov 2021 23:42:59 +0800</pubDate><description><![CDATA[项目启动入口

实际执行的内容是通过SpringApplication类的静态方法创建一个ConfigurableApplicationContext，顾名思义，即可配置的对象容器，也就是Springboot中的上下文
/**
 * Static helper that can be used to run a {@link SpringApplication} from the
 * specified source using default settings.
 * @param primarySou]]></description><category></category></item><item><title><![CDATA[SpringBoot启动过程分析——@SpringBootApplication注解分析]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/121154081</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/121154081</guid><author>crazyjack1</author><pubDate>Fri, 05 Nov 2021 00:02:06 +0800</pubDate><description><![CDATA[## 启动类

调用SpringApplication.run方法启动,启动类使用@SpringBootApplication注解
@SpringBootApplication
public class StringBootDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(StringBootDemoApplication.class, args);
    }
}

@S]]></description><category></category></item><item><title><![CDATA[监控工具Actuator使用]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/120361318</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/120361318</guid><author>crazyjack1</author><pubDate>Sat, 18 Sep 2021 09:41:39 +0800</pubDate><description><![CDATA[添加依赖
Spring Boot已经内置了一个监控功能，它叫Actuator。使用Actuator非常简单，只需添加如下依赖：
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;!-- actuator --&gt;
&lt;]]></description><category></category></item><item><title><![CDATA[Redis的发布订阅Topic模式]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/120317084</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/120317084</guid><author>crazyjack1</author><pubDate>Wed, 15 Sep 2021 21:17:17 +0800</pubDate><description><![CDATA[核心代码：
Springboot下的redis发布订阅topic模式，与Springboot的Event事件有异曲同工之妙，但是redis的发布订阅可以用于分布式系统，但是Event只能在同一个JVM实例起作用，同时要注意的是，因为redis是面向分布式系统设计的，因此有多个JVM实例都订阅了同一个Topic的话，会产生重复消费，因此如果不需要重复消费的场景，在消费的时候一定要在消费的时候进行幂等校验。Event使用的博客在SpringBoot Event 事件监听，这两种消息队列可靠性都不是很高，因为没有]]></description><category></category></item><item><title><![CDATA[JAVA垃圾收集器之G1]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/120244412</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/120244412</guid><author>crazyjack1</author><pubDate>Sat, 11 Sep 2021 22:40:48 +0800</pubDate><description><![CDATA[Garbage First（G1）收集器
Garbage First（简称G1）收集器是垃圾收集器技术发展历史上的里程碑式的成果，它开创了收集 器面向局部收集的设计思路和基于Region的内存布局形式。G1提供并发的类卸载的支持，补全了其计划功能的最后一块拼图。这个版本以后的G1收集器才被Oracle官方称为“全功能的垃圾收集器”（Fully-Featured Garbage Collector）。
G1是一款主要面向服务端应用的垃圾收集器。HotSpot开发团队最初赋予它的期望是（在比较长 期的）未来可以]]></description><category></category></item><item><title><![CDATA[CAS原理详解]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/120244049</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/120244049</guid><author>crazyjack1</author><pubDate>Sat, 11 Sep 2021 22:11:21 +0800</pubDate><description><![CDATA[CAS简介
CAS 的意思是 compare and swap，比较并交换。CAS 的引入是为了解决java锁机制带来的性能问题。锁机制存在以下问题：
（1）在多线程竞争下，加锁、释放锁会导致比较多的上下文切换和调度延时，引起性能问题。
（2）一个线程持有锁会导致其它所有需要此锁的线程挂起。
（3）如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置，引起性能风险。
解决线程安全问题volatile是不错的机制，但是volatile不能保证原子性。因此对于同步最终还是要回到锁机制上来。
独占锁]]></description><category></category></item><item><title><![CDATA[JVM垃圾收集器]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/120190593</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/120190593</guid><author>crazyjack1</author><pubDate>Wed, 08 Sep 2021 22:41:38 +0800</pubDate><description><![CDATA[Serial收集器
Serial收集器是最基础、历史最悠久的收集器，曾经（在JDK 1.3.1之前）是HotSpot虚拟机新生代 收集器的唯一选择。
大家只看名字就能够猜到，这个收集器是一个单线程工作的收集器，但它的“单线 程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作，更重要的是强 调在它进行垃圾收集时，必须暂停其他所有工作线程，直到它收集结束。“Stop The World”这个词语也 许听起来很酷，但这项工作是由虚拟机在后台自动发起和自动完成的，在用户不可知、不可控的情况]]></description><category></category></item><item><title><![CDATA[JAVA垃圾回收算法]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/120118810</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/120118810</guid><author>crazyjack1</author><pubDate>Sun, 05 Sep 2021 18:21:33 +0800</pubDate><description><![CDATA[概述
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙，墙外面的人想进去，墙里面的人却想出来。C++内存的申请和释放都可以由程序员手动进行，而Java则采用了自动垃圾回收机制使程序员更关注于业务而无需在内存分配和回收上花费太多的时间。但是我们仍然需要去学习Java的垃圾回收机制，要理清楚Java的垃圾回收机制，要搞清楚三点：

哪些内存需要回收
什么时候回收
怎么回收

如何判断对象已经成为垃圾
在堆里面存放着Java世界中几乎所有的对象实例，垃圾收集器在对堆进行回收前，第一件事情就是要.]]></description><category></category></item><item><title><![CDATA[HTTPS加密算法原理]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/119716307</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/119716307</guid><author>crazyjack1</author><pubDate>Sun, 15 Aug 2021 17:31:25 +0800</pubDate><description><![CDATA[1、对称加密

信收发方会通过实现商定好的秘钥对数据进行加密和解密

缺陷：

用户增多秘钥的传输过需要保存许多额外的秘钥

秘钥的保存会带来额外的负担
更加致命的是，秘钥必须通过见面协商，而没有办法通过网络来进行交换

因为秘钥的传输过程需要加密，而没有秘钥则不能进行加密，这样就陷入死循环了，因此就引出了非对称加密算法。
2、非对称加密算法

其中，对数据进行加密的秘钥是对所有人公开的，而对数据解密的秘钥却仅为数据的接收者持有

因为公钥是对所有人可见的，因此，数据不能被轻易地解密出来，因此要求加密算法单]]></description><category></category></item><item><title><![CDATA[JAVA线程池ThreadPoolExecutor详解]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/119716187</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/119716187</guid><author>crazyjack1</author><pubDate>Sun, 15 Aug 2021 16:59:00 +0800</pubDate><description><![CDATA[1、开发规约
阿里巴巴开发手册中关于线程和线程池的使用有如下三条强制规约
【强制】创建线程或线程池时请指定有意义的线程名称，方便出错时回溯。
正例：自定义线程工厂，并且根据外部特征进行分组，比如，来自同一机房的调用，把机房编号赋值给whatFeatureOfGroup
public class UserThreadFactory implements ThreadFactory {
    private final String namePrefix;
    private final AtomicIn]]></description><category></category></item><item><title><![CDATA[HashMap源码数据结构与动态扩容分析]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/119304945</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/119304945</guid><author>crazyjack1</author><pubDate>Sun, 01 Aug 2021 22:41:46 +0800</pubDate><description><![CDATA[涉及知识点
位运算 继承 数据结构 数组 链表 红黑树
HashMap基本知识
JDK1.8之前数据结构是数组+链表
JDK1.8以后采用数组+链表+红黑树

其中，当数组元素超过64个且数组单个位置存储的链表元素个数超过8个时，会进化成红黑树，红黑树的引进时为了加快查找效率
同样，当数组单个位置存储的链表元素个数少于6个时，又会退化成链表
HashMap重要的类属性
其实JDK的源码都有非常详细的注释，但还是翻译一下吧，如下：

初始容量大小为16

/**
 * The default initial ]]></description><category></category></item><item><title><![CDATA[Redis必会知识点]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/119190528</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/119190528</guid><author>crazyjack1</author><pubDate>Wed, 28 Jul 2021 21:26:11 +0800</pubDate><description><![CDATA[Redis是一款使用C语言编写、可基于内存也可以持久化的日志型、Key-Value型开源数据库。它可以用作：数据库、缓存和消息中间件。
数据结构
redis支持的5种基本数据类型：




数据类型
定义
使用场景




字符串（String）
Redis的基本数据类型,一个Key对应一个Value
缓存、计数器、分布式锁等


哈希（Hash)
Hash是一个string类型的key和value的映射表，特别适合用于存储对象
用户信息、Hash 表等


列表（List）
List是简单的字符串列表，按]]></description><category></category></item><item><title><![CDATA[RabbitMQ实战指南之消息可靠性]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/119108353</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/119108353</guid><author>crazyjack1</author><pubDate>Mon, 26 Jul 2021 14:19:29 +0800</pubDate><description><![CDATA[要保证消息的可靠性，就需要保证消息在流转的每一个阶段都能够保证可靠性

从图上我们大概可以看出来一个消息会经历四个节点，只有保证这四个节点的可靠性才能保证整个系统的可靠性。

生产者发出后保证到达了MQ。
MQ收到消息保证分发到了消息对应的Exchange。
Exchange分发消息入队之后保证消息的持久性。
消费者收到消息之后保证消息的正确消费。

生产者发送消息到MQ Broker可靠性保障
这是消息流转的第一个过程，我们的生产者发送消息之后可能由于网络闪断等各种原因导致我们的消息并没有发送到MQ之中，]]></description><category></category></item><item><title><![CDATA[RabbitMQ实战指南之RabbitMQ架构及运转流程]]></title><link>https://blog.youkuaiyun.com/crazyjack1/article/details/119089832</link><guid>https://blog.youkuaiyun.com/crazyjack1/article/details/119089832</guid><author>crazyjack1</author><pubDate>Sun, 25 Jul 2021 23:17:37 +0800</pubDate><description><![CDATA[相关概念
RabbitMQ 整体上是一个生产者与消费者模型，主要负责接收、存储和转发消息。可以把消息传递的过程想象成∶ 当你将一个包裹送到邮局，邮局会暂存并最终将邮件通过邮递员送到收件人的手上，RabbitMQ 就好比由邮局、邮箱和邮递员组成的一个系统。从计算机术语层面来说， RabbitMQ 模型更像是一种交换机模型。RabbitMQ 的整体模型架构如所示。

生产者和消费者
Producer∶ 生产者，就是投递消息的一方。
生产者创建消息，然后发布到 RabbitMQ 中。消息一般可以包含 2 个部分∶]]></description><category></category></item></channel></rss>