<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
    <channel>
        <title>沧澜的博客</title>
        <link>https://www.meetxiyu.cn</link>
            <description>芝兰生于幽谷，不以无人而不芳<br/>
君子修身养德，不以穷困而改志</description>
        <language>zh-CN</language>
                <item>
                    <title>
                        <![CDATA[
                            在Java中基于某特定接口获取所有ClassPath下的所有实现类的一些思考（上）
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E5%9C%A8Java%E4%B8%AD%E5%9F%BA%E4%BA%8E%E6%9F%90%E7%89%B9%E5%AE%9A%E6%8E%A5%E5%8F%A3%E8%8E%B7%E5%8F%96%E6%89%80%E6%9C%89ClassPath%E4%B8%8B%E7%9A%84%E6%89%80%E6%9C%89%E5%AE%9E%E7%8E%B0%E7%B1%BB%E7%9A%84%E4%B8%80%E4%BA%9B%E6%80%9D%E8%80%83%EF%BC%88%E4%B8%8A%EF%BC%89</link>
                    <content:encoded>
                        <![CDATA[
                            背景
第一次遇到这个问题是在考虑基于接口，如何高效寻找所有的实现类：

工厂模式中：需要将所有支持生产的类型注册到工厂类中，每新增一个类型要修改一次工厂类的代码（对修改无法关闭）
策略模式中：所有支持的策略需要注册到管理类中，每新增一种策略需要修改一次策略管理类的代码

如果涉及分模块开发时，实现类
                        ]]>
                    </content:encoded>
                    <pubDate>Oct 23, 2021 11:15:05 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            软件设计及其思想小节（上）
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%E5%8F%8A%E5%85%B6%E6%80%9D%E6%83%B3%E5%B0%8F%E8%8A%82%EF%BC%88%E4%B8%8A%EF%BC%89</link>
                    <content:encoded>
                        <![CDATA[
                            引言
这篇文章，还是对之前技术思想的一些总结，经历过软件设计的共同点，才发现万变不离其宗，变化的只是形式，也算是对自己基础的一点警醒
以前我在思考为什么要学习计算机基础原理、网络编程、算法和数据结构，直到前几日：我与TL聊起MQ队列的可靠性消息与TCP的可靠性传输ack机制惊人的相似，我们在学习一门
                        ]]>
                    </content:encoded>
                    <pubDate>Oct 7, 2021 11:44:23 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            领域驱动设计(DDD)复杂的术语——软件设计（二）
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%28DDD%29%E5%A4%8D%E6%9D%82%E7%9A%84%E6%9C%AF%E8%AF%AD%E2%80%94%E2%80%94%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%EF%BC%88%E4%BA%8C%EF%BC%89</link>
                    <content:encoded>
                        <![CDATA[
                            引文
从这里开始，本文（算是连载文）打算从基础的概念去理解DDD，上文主要讲了DDD的概念和原则，今天就从基础名词和核心思想来理解它。
DDD的体系引入了很多名词，从解决问题的方向分为：领域、子域、核心域、通用域、支撑域、限界上下文，从建模的方向又分为：聚合、聚合根、实体、值对象等等，这些名词真的是
                        ]]>
                    </content:encoded>
                    <pubDate>Oct 1, 2021 10:49:50 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            SpringBoot核心思想及源码解析（下）——启动原理
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/SpringBoot%E6%A0%B8%E5%BF%83%E6%80%9D%E6%83%B3%E5%8F%8A%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%EF%BC%88%E4%B8%8B%EF%BC%89%E2%80%94%E2%80%94%E5%90%AF%E5%8A%A8%E5%8E%9F%E7%90%86</link>
                    <content:encoded>
                        <![CDATA[
                            引言
得益于SpringBoot这个脚手架封装了很多繁琐的操作，我们只需要通过java -jar一行命令便启动了一个Web服务器；再也不需要搭建tomcat等相关服务，这里我们就来深入探究一下SpringBoot容器启动的原理。
这篇文章是接着上文SpringBoot核心思想及源码解析——自动装配的
                        ]]>
                    </content:encoded>
                    <pubDate>Sep 23, 2021 10:31:15 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            个人技术的思考和自我反思
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E4%B8%AA%E4%BA%BA%E6%8A%80%E6%9C%AF%E7%9A%84%E6%80%9D%E8%80%83%E5%92%8C%E8%87%AA%E6%88%91%E5%8F%8D%E6%80%9D</link>
                    <content:encoded>
                        <![CDATA[
                            最近，在HW的项目结束，回到成都趁着空档，做一个小小的经历总结。
（本篇文章涉及少部分技术，更多的是一些自己的思考和总结）
技术入门

以充满激情的想法、热情逐渐入门，逐渐增加广度，逐渐寻找自己的方向

在全球蛙电子商务公司我是一个对技术充满期待、充满热情的人，看到每个新技术，就在想为什么这么神奇，
                        ]]>
                    </content:encoded>
                    <pubDate>Sep 12, 2021 7:25:18 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            领域驱动设计(DDD)到底在说什么——软件设计（一）
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%28DDD%29%E5%88%B0%E5%BA%95%E5%9C%A8%E8%AF%B4%E4%BB%80%E4%B9%88%E2%80%94%E2%80%94%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1%EF%BC%88%E4%B8%80%EF%BC%89</link>
                    <content:encoded>
                        <![CDATA[
                            前言
之前看了很多关于领域驱动设计(DDD)的课程和书籍，发现都没有切合实际的去描述领域驱动设计到底是什么，可能看了几本书也不知道DDD到底该怎么落地。这里因为我在项目中实践了DDD，正好借此机会做一些总结，顺便借助费曼学习法去把DDD讲出来，也是对自己的理解做一些深思和反省。（文中的所有观点均来自
                        ]]>
                    </content:encoded>
                    <pubDate>Aug 24, 2021 10:46:18 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            SpringBoot核心思想及源码解析（上）——自动装配
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/SpringBoot%E6%A0%B8%E5%BF%83%E6%80%9D%E6%83%B3%E5%8F%8A%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%EF%BC%88%E4%B8%8A%EF%BC%89%E2%80%94%E2%80%94%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D</link>
                    <content:encoded>
                        <![CDATA[
                            引言
最近几年随着微服务的发展，SpringCloud火了，随之SpringBoot这个“脚手架”逐渐被大家所喜爱，主要是它的方便和快捷，无需各种xml配置，一个主方法直接跑一个后台程序，想整合其他框架时，只需要在pom文件中引入一个starter，类上加一个@EnableXXX的注解，就可以很快的
                        ]]>
                    </content:encoded>
                    <pubDate>Jul 18, 2021 9:59:04 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            聊聊ConcurrentHashMap的执行内幕（下）
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E8%81%8A%E8%81%8AConcurrentHashMap%E7%9A%84%E6%89%A7%E8%A1%8C%E5%86%85%E5%B9%95%EF%BC%88%E4%B8%8B%EF%BC%89</link>
                    <content:encoded>
                        <![CDATA[
                            
JDK版本 8u251

解决完成死循环BUG相关的问题，我们来看看ConcurrentHashMap操作相关的多线程计数、查询、删除等方法。
多线程计数
CounterCell

首先回到我们计数的起点，新增元素putVal方法，在新增元素成功后会调用addCount方法，在Concurrent
                        ]]>
                    </content:encoded>
                    <pubDate>Jun 5, 2021 11:58:02 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            从死循环BUG来聊聊ConcurrentHashMap的执行内幕（上）
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E4%BB%8E%E6%AD%BB%E5%BE%AA%E7%8E%AFBUG%E6%9D%A5%E8%81%8A%E8%81%8AConcurrentHashMap%E7%9A%84%E6%89%A7%E8%A1%8C%E5%86%85%E5%B9%95%28%E4%B8%8A%29</link>
                    <content:encoded>
                        <![CDATA[
                            
JDK版本 8u251

前几日遇到的一个问题：一个SpringBoot项目凭空“起不来”了，日志刚刚输出完一个加载数据库驱动的配置，检查数据库用DataGrip能正常连接。很纳闷，偏偏这个时候就自己的环境起不起来其他人都可以正常启动（后来定位到和每个机器的环境变量参数数量有关）。
那咱们只能撸堆
                        ]]>
                    </content:encoded>
                    <pubDate>May 29, 2021 10:45:32 AM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            深入理解计算机网络IO（中）——IO多路复用
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9CIO%EF%BC%88%E4%B8%AD%EF%BC%89%E2%80%94%E2%80%94IO%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8</link>
                    <content:encoded>
                        <![CDATA[
                            上一篇文章已经介绍了IO 多路复用的含义，这里着重看一下linux系统多路复用实现的API

select
select 使用文档在：select(2) - Linux manual page
接口定义如下：
int select(int nfds, fd_set *readfds, fd_set 
                        ]]>
                    </content:encoded>
                    <pubDate>Apr 19, 2021 10:14:54 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            深入理解计算机网络IO（上）——IO模型
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9CIO%EF%BC%88%E4%B8%8A%EF%BC%89%E2%80%94%E2%80%94IO%E6%A8%A1%E5%9E%8B</link>
                    <content:encoded>
                        <![CDATA[
                            今天来学习下：什么是IO？如何完成一次IO？什么是IO多路复用？
概念说明
在谈IO模型之前，我们先来了解一下这里面涉及一些概念：

Socket套接字和TCP连接
用户空间与内核空间
Socket缓存区
CPU中断

Socket套接字和TCP连接
Socket中文翻译为“插孔”、“插槽”，Soc
                        ]]>
                    </content:encoded>
                    <pubDate>Mar 11, 2021 9:23:49 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            抽象资源同步器框架AQS原理（五）——从内存屏障到volatile原理
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E6%8A%BD%E8%B1%A1%E8%B5%84%E6%BA%90%E5%90%8C%E6%AD%A5%E5%99%A8%E6%A1%86%E6%9E%B6AQS%E5%8E%9F%E7%90%86%EF%BC%88%E4%BA%94%EF%BC%89%E2%80%94%E2%80%94%E4%BB%8E%E5%86%85%E5%AD%98%E5%B1%8F%E9%9A%9C%E5%88%B0volatile%E5%8E%9F%E7%90%86</link>
                    <content:encoded>
                        <![CDATA[
                            并发问题的背景
这里我们先从最源头，想想volatile的存在为了解决什么样的问题？
随着CPU、内存、IO设备不断更新发展，有一个核心矛盾一直存在：CPU、内存、IO三者的速度差距
为了合理利用 CPU 的高性能，平衡这三者的速度差异，计算机体系结构、操作系统、编译程序都做出了贡献，主要体现为：C
                        ]]>
                    </content:encoded>
                    <pubDate>Feb 18, 2021 11:52:43 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            抽象资源同步器框架AQS原理（四）——Synchronized锁原理
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E6%8A%BD%E8%B1%A1%E8%B5%84%E6%BA%90%E5%90%8C%E6%AD%A5%E5%99%A8%E6%A1%86%E6%9E%B6AQS%E5%8E%9F%E7%90%86%EF%BC%88%E5%9B%9B%EF%BC%89%E2%80%94%E2%80%94Synchronized%E9%94%81%E5%8E%9F%E7%90%86</link>
                    <content:encoded>
                        <![CDATA[
                            前几天看到AQS的一个问题：

有了 synchronized 为什么还要重复造轮子？

我们顺便来回顾下概念
Synchronized 原理
Synchronized在1.6之前也叫重量级锁，随着Java SE 1.6对Synchronized进行了各种优化之后，有些情况下它就并不那么重了，它的作
                        ]]>
                    </content:encoded>
                    <pubDate>Jan 28, 2021 7:25:27 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            谈谈我的2020
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E8%B0%88%E8%B0%88%E6%88%91%E7%9A%842020</link>
                    <content:encoded>
                        <![CDATA[
                            抓住2020最后的小尾巴，最后抽点时间，谈谈我的2020~
总览


19年结束时，我在西安，2020快结束时，我还在西安...

西安是我人生轨迹中很重要的部分，生活上用两句话来说就是：从之前的假北方人变成了假四川人，从之前的臊子面油条火锅变成了牛肉面泡馍烧烤；技术上我很幸运，上半年跟着山哥（项目
                        ]]>
                    </content:encoded>
                    <pubDate>Jan 7, 2021 9:05:18 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            抽象资源同步器框架AQS原理（三）——条件队列
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E6%8A%BD%E8%B1%A1%E8%B5%84%E6%BA%90%E5%90%8C%E6%AD%A5%E5%99%A8%E6%A1%86%E6%9E%B6AQS%E5%8E%9F%E7%90%86%EF%BC%88%E4%B8%89%EF%BC%89%E2%80%94%E2%80%94%E6%9D%A1%E4%BB%B6%E9%98%9F%E5%88%97</link>
                    <content:encoded>
                        <![CDATA[
                            条件队列是什么
背景

了解这个问题之前，我们先来了解下为什么需要wait与notify？

网上有一个经典的栗子：图书馆有一本《Java并发编程艺术》，张三首先借走了（持有锁），李四也想借这个本书，但是不能每天都去图书馆看一下（轮训）张三是否归还，张三也不是每天都来说我还要看几天，这时候就需要一个
                        ]]>
                    </content:encoded>
                    <pubDate>Dec 24, 2020 7:50:07 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            抽象资源同步器框架AQS原理（二）——共享模式
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E6%8A%BD%E8%B1%A1%E8%B5%84%E6%BA%90%E5%90%8C%E6%AD%A5%E5%99%A8%E6%A1%86%E6%9E%B6AQS%E5%8E%9F%E7%90%86%EF%BC%88%E4%BA%8C%EF%BC%89%E2%80%94%E2%80%94%E5%85%B1%E4%BA%AB%E6%A8%A1%E5%BC%8F</link>
                    <content:encoded>
                        <![CDATA[
                            前面我们了解了AbstractQueuedSynchronizer框架独占模式的流程，今天我们借助Semaphore的源码来学习下共享模式的原理。
共享模式
共享模式和独占模式的关系就好比共享锁和独占锁，共享模式在获取资源或者是释放资源时，都可能会唤醒后面所有非独占的节点，共享模式它交给子类实现的方
                        ]]>
                    </content:encoded>
                    <pubDate>Nov 19, 2020 8:32:58 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            抽象资源同步器框架AQS原理（一）——独占模式
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/%E6%8A%BD%E8%B1%A1%E8%B5%84%E6%BA%90%E5%90%8C%E6%AD%A5%E5%99%A8%E6%A1%86%E6%9E%B6AQS%E5%8E%9F%E7%90%86%EF%BC%88%E4%B8%80%EF%BC%89%E2%80%94%E2%80%94%E7%8B%AC%E5%8D%A0%E6%A8%A1%E5%BC%8F</link>
                    <content:encoded>
                        <![CDATA[
                            AQS 是什么
AbstractQueuedSynchronizer（简称AQS）是一个多线程访问共享资源的抽象同步器框架，说简单点就是主要由 一个状态(state) + 双向无锁队列(CLH) 组成的工具，它主要提供了同步状态原子性管理、线程的阻塞和解除阻塞、队列的管理的方法，是Java并发包的基
                        ]]>
                    </content:encoded>
                    <pubDate>Oct 15, 2020 8:22:29 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            MySQL学习篇(9)——MySQL对LRU的优化
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/MySQL%E5%AD%A6%E4%B9%A0%E7%AF%87%289%29%E2%80%94%E2%80%94flush%E9%93%BE%E8%A1%A8%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%8CBuffer+Pool%E6%BB%A1%E4%BA%86%E6%80%8E%E4%B9%88%E5%8A%9E</link>
                    <content:encoded>
                        <![CDATA[
                            基于冷热数据分离的思想设计LRU链表
为了解决上一讲我们说的简单的LRU链表的问题，真正MySQL在设计LRU链表的时候，采取的实际上是冷热数据分离的思想。
之前一系列的问题，就是因为所有缓存页都混在一个LRU链表里，才导致的。
所以真正的LRU链表，会被拆分为两个部分，一部分是热数据，一部分是冷数
                        ]]>
                    </content:encoded>
                    <pubDate>Mar 30, 2020 11:45:33 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            MySQL学习篇(8)——flush链表是什么，Buffer Pool满了怎么办
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/MySQL%E5%AD%A6%E4%B9%A0%E7%AF%87%288%29%E2%80%94%E2%80%94flush%E9%93%BE%E8%A1%A8%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%8C%E5%92%8CBuffer+Pool%E6%9C%89%E4%BB%80%E4%B9%88%E5%85%B3%E7%B3%BB</link>
                    <content:encoded>
                        <![CDATA[
                            问题背景
在执行增删改的时候，如果发现数据页没缓存，那么必然会基于free链表找到一个空闲的缓存页，然后读取到缓存页里去，但是如果已经缓存了，那么下一次就必然会直接使用缓存页。
需要更新的数据页都会在Buffer Pool的缓存页里，供你在内存中直接执行增删改的操作。
接着去更新Buffer Poo
                        ]]>
                    </content:encoded>
                    <pubDate>Mar 25, 2020 11:38:35 PM</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[
                            MySQL学习篇(7)——free链表是什么，和Buffer Pool有什么关系
                        ]]>
                    </title>
                    <link>https://www.meetxiyu.cn/archives/MySQL%E5%AD%A6%E4%B9%A0%E7%AF%87%287%29%E2%80%94%E2%80%94free%E9%93%BE%E8%A1%A8%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%8C%E5%92%8CBuffer+Pool%E6%9C%89%E4%BB%80%E4%B9%88%E5%85%B3%E7%B3%BB</link>
                    <content:encoded>
                        <![CDATA[
                            当数据库启动之后，buffer pool也分配好了，只不过这个时候，Buffer Pool中的一个一个的缓存页都是空的，里面什么都没有，要等数据库运行起来之后，当我们要对数据执行增删改查的操作的时候，才会把数据对应的页从磁盘文件里读取出来，放入Buffer Pool中的缓存页中。
我们怎么知道哪些缓
                        ]]>
                    </content:encoded>
                    <pubDate>Mar 22, 2020 10:48:58 PM</pubDate>
                </item>
    </channel>
</rss>