<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[王小汪的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/u010800201</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u010800201]]></copyright><item><title><![CDATA[通勤车油耗(算法题)]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/120553358</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/120553358</guid><author>u010800201</author><pubDate>Wed, 29 Sep 2021 17:52:21 +0800</pubDate><description><![CDATA[字节跳动在北京有 N 个工区，形成一个环状，Bytebus 是往返在各个工区的通勤车，按工区的顺序行驶，其中第 i 个工区有汽油 gas[i] 升。你有一辆油箱容量无限的 Bytebus，从第 i 个工区开往第 i+1 个工区需要消耗汽油 cost[i] 升。你从其中的一个工区出发，开始时油箱为空，可以使用当前工区的汽油 gas[i]升。如果你可以绕环路行驶一周，则返回出发时工区的编号，否则返回 -1。 

输入：gas = [1,2,3,4,5] cost = [3,4,5,1,2] 

输出：3 

遇]]></description><category></category></item><item><title><![CDATA[Redis分布式锁相关]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/120460338</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/120460338</guid><author>u010800201</author><pubDate>Fri, 24 Sep 2021 17:54:49 +0800</pubDate><description><![CDATA[深度剖析：Redis分布式锁到底安全吗？看完这篇文章彻底懂了！_Java知音-优快云博客
]]></description><category></category></item><item><title><![CDATA[Spring容器启动主流程（SpringBoot）]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/120414482</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/120414482</guid><author>u010800201</author><pubDate>Wed, 22 Sep 2021 14:37:06 +0800</pubDate><description><![CDATA[肝了两个晚上，主流程梳理完毕，其他诸如循环依赖、ConfigurationClassPostProcessor、SpringMVC的流程图后边会继续肝

附ProcessOn链接：Spring流程图 | ProcessOn免费在线作图,在线流程图,在线思维导图 |
]]></description><category></category></item><item><title><![CDATA[并发编程-AQS抽象队列同步器详解]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/107088254</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/107088254</guid><author>u010800201</author><pubDate>Fri, 17 Sep 2021 13:43:33 +0800</pubDate><description><![CDATA[在并发编程的大军中，有两个阵营，一个就是synchronized内置关键字实现同步的阵营，另外一个就是这次要说的采用AQS框架实现同步的阵营，可以去juc并发包里去看看这些类的实现方式。

那么什么是AQS呢？我理解的AQS其实就是维持了一个先进先出的FIFO队列，然后各种并发实现类继承AQS抽象类来实现同步操作，那么下面我们通过几个图来看一下AQS的机制


    //同步标识位
    private volatile int state;

    //获取标识位
    protected fin]]></description><category></category></item><item><title><![CDATA[MySQL之MVCC多版本并发控制]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/119942189</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/119942189</guid><author>u010800201</author><pubDate>Mon, 06 Sep 2021 16:54:36 +0800</pubDate><description><![CDATA[首先MVCC是属于InnoDB用来保证事务的一种读取数据的机制，InnoDB读取数据的方式有两种，一种是快照读，一种是当前读，而MVCC就是快照读用来保证事务的机制。


 在MySQL读取数据时可以按照是否使用一致性非锁定读来分为快照读和当前读：
1、快照读：MySQL使用MVCC (Multiversion Concurrency Control)机制来保证被读取到数据的一致性，读取数据时不需要对数据进行加锁，且快照读不会被其他事物阻塞。
2、当前读：也称锁定读(locking...]]></description><category></category></item><item><title><![CDATA[Sentinel网关流控页面显示不出来-排查]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/118340722</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/118340722</guid><author>u010800201</author><pubDate>Tue, 29 Jun 2021 23:31:20 +0800</pubDate><description><![CDATA[今天准备集成Sentinel+Gateway，做网关流控，引入了以下这么maven依赖


 &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
            &lt;artifactId&gt;spring-cloud-starter-gateway&lt;/artifactId&gt;
        &lt;/dependency&gt;

        &lt;de]]></description><category></category></item><item><title><![CDATA[Java集合源码（一）ArrayList源码]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/118027579</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/118027579</guid><author>u010800201</author><pubDate>Fri, 18 Jun 2021 17:27:54 +0800</pubDate><description><![CDATA[首先，初始化一个ArrayList对象有四种情况

1、List a = new ArrayList();

2、List a = new ArrayList
]]></description><category></category></item><item><title><![CDATA[Spring源码-ConfigurationClassPostProcessor的调用时序]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/112499567</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/112499567</guid><author>u010800201</author><pubDate>Mon, 11 Jan 2021 23:36:04 +0800</pubDate><description><![CDATA[最近看Spring源码的时候，发现了一个有意思的事情，记录一下

ConfigurationClassPostProcessor作为注解流程中最核心的类，那么它的调用时序是怎样的呢？

以 AnnotationConfigApplicationContext作为起点：


/**
	 * Create a new AnnotationConfigApplicationContext, deriving bean definitions
	 * from the given component classes]]></description><category></category></item><item><title><![CDATA[docker搭建Zookeeper集群]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/112191068</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/112191068</guid><author>u010800201</author><pubDate>Mon, 04 Jan 2021 18:05:18 +0800</pubDate><description><![CDATA[一、前言
在单台服务器上，部署三个docker容器，搭建zookeeper集群
二、过程
1.准备工作
这里我使用的是docker来搭建zookeeper集群，所以必须提前准备好以下内容：
安装docker
拉取zookeeper镜像（这里我用的是3.4.10版本）

docker pull zookeeper:3.4.10
2.开始搭建
单个节点不能叫做集群，而两个节点也不好做集群，这里我创建了三个zookeeper节点来搭建集群（友情提示：最好是用奇数个节点做集群）
（1）利用镜像启动三个zookeep]]></description><category></category></item><item><title><![CDATA[记录Spring-Cloud-Stream集成RocketMQ踩坑实录]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/112004360</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/112004360</guid><author>u010800201</author><pubDate>Thu, 31 Dec 2020 11:07:20 +0800</pubDate><description><![CDATA[一、引入jar包（跟随spring-cloud-alibaba-dependencies走）
&lt;dependency&gt;
        &lt;groupId&gt;com.alibaba.cloud&lt;/groupId&gt;
        &lt;artifactId&gt;spring-cloud-starter-stream-rocketmq&lt;/artifactId&gt;
&lt;/dependency&gt;

二、确定版本
截至到spring-cloud-alibaba]]></description><category></category></item><item><title><![CDATA[JVM基础知识（七）- 静态分派和动态分派]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/107816253</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/107816253</guid><author>u010800201</author><pubDate>Wed, 05 Aug 2020 16:49:38 +0800</pubDate><description><![CDATA[Java 是一门面向对象的程序语言，因为Java 具备面向对象的3 个基本特征:继承、封装和多态。这三个特征并不是各自独立的，从一定角度上看，封装和继承几乎都是为多态而准备的，多态的体现主要表现在方法的调用上，而方法在调用时会根据你送入的参数有不同的表现形式，这个就是分派：

1.编译期根据对象的静态类型进行静态分派。

2.运行期根据对象的实际类型进行动态分派。

那么我们都知道，方法的调用主要体现在对方法的重载和重写上，那么其实这里，静态分派对应的就是方法的重载，动态分派对应的是方法的调用。



静.]]></description><category></category></item><item><title><![CDATA[JVM基础知识（六）-类加载机制和类加载器]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/107763037</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/107763037</guid><author>u010800201</author><pubDate>Tue, 04 Aug 2020 16:37:09 +0800</pubDate><description><![CDATA[类的加载指的是将类的.class文件中的二进制数据读入到内存中，将其放在运行时数据区的方法区内，然后在堆区创建一个 java.lang.Class对象，用来封装类在方法区内的数据结构，那么负责将类加载到JVM内存空间的就是类加载器。

类的生命周期

 类的生命周期分为加载，验证，准备，解析，初始化，使用和销毁七个阶段，其中验证、准备、解析3 个部分统称为连接（Linking）。



 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中，...]]></description><category></category></item><item><title><![CDATA[JVM基础知识（五）- 三色标记]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/107684597</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/107684597</guid><author>u010800201</author><pubDate>Thu, 30 Jul 2020 16:36:46 +0800</pubDate><description><![CDATA[一、概念

 JVM 中的垃圾回收是基于 标记-复制、标记-清除和标记-整理三种模式的，那么其中最重要的其实是如何标记，像Serial、Parallel这类的回收器，无论是单线程标记和多线程标记，其本质采用的是暂停用户线程进行全面标记的算法，这种算法的好处就是标记的很干净，而且实现简单，缺点就是标记时间相对很长，导致STW的时间很长。

 那么后来就有了并发标记，适用于CMS和G1，并发标记的意思就是可以在不暂停用户线程的情况下对其进行标记，那么实现这种并发标记的算法就是三色标记法，...]]></description><category></category></item><item><title><![CDATA[JVM基础知识（四）- 分代回收机制和垃圾回收算法]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/107630237</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/107630237</guid><author>u010800201</author><pubDate>Wed, 29 Jul 2020 14:45:43 +0800</pubDate><description><![CDATA[这次我们来讲讲垃圾回收，前边或多或少的都提及过垃圾回收的知识点，我们经常说的GC（Garbage Collection）就是垃圾回收，我们都知道JAVA都是由C++演化而来，那么JAVA和C++很重要的一点不同就是自动分配内存和自动回收内存，这两块已经不需要JAVA开发者来操心。但是GC对性能是有影响的，有时候会暂停所有的线程，触发STW（Stop the world），所以GC是把双刃剑。那么一般情况下，垃圾回收的重点是在堆区，栈区是随线程的消亡而消亡的，不需要垃圾回收器去管理，方法区虽说可以进行垃圾回收]]></description><category></category></item><item><title><![CDATA[JVM基础知识（三）- JVM对象创建及引用过程]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/107560937</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/107560937</guid><author>u010800201</author><pubDate>Mon, 27 Jul 2020 15:53:02 +0800</pubDate><description><![CDATA[　　OK，前边有说过JVM的模块都有哪些，方法区、虚拟机栈、本地方法栈、程序计数器、还有我们下面要说的堆，那么到此时，这些模块还都是相互独立的，我们需要把这些模块都串联起来，这样才能更系统的了解JVM，这就是今天要说的对象的创建过程。

 首先我们先看个图，然后根据图来阐述这个对象的创建过程：

 

类加载

 首先就是类加载，类加载就是把class 加载到JVM 的运行时数据区的过程--&gt;静态常量池转化成运行时常量池（类加载这个以后专门讲类加载器的时候再讲）。

检...]]></description><category></category></item><item><title><![CDATA[JVM基础知识（二）]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/107507173</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/107507173</guid><author>u010800201</author><pubDate>Thu, 23 Jul 2020 16:14:34 +0800</pubDate><description><![CDATA[JAVA 方法的运行与虚拟机栈

 一个java程序的执行意味着操作系统首先会为这个java程序分配一个线程，jvm同时会在内存空间中分配一个虚拟机栈来存储这个线程运行时所需的相关的数据，虚拟机栈的数据结构就是一个栈，因为它的先进后出的数据结构能够很好的阐述java方法运行的顺序。一个java程序的启动，其中肯定是包含了一个或者多个java方法，那么jvm就会在虚拟机栈中为每一个方法都分配一个栈帧，所谓栈帧就是存储了当前方法所需的数据内容的，也就是局部变量，类中的类变量是存储在方法区的。程序在执...]]></description><category></category></item><item><title><![CDATA[JVM基础知识（一）]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/107488042</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/107488042</guid><author>u010800201</author><pubDate>Tue, 21 Jul 2020 15:56:28 +0800</pubDate><description><![CDATA[什么是JVM 

 JVM是JAVA语言的一个重要组成部分，它完成了JAVA体系中最底层的与内存，操作系统交互的工作，也是学习JAVA首先学习，也是最应该学习的部分，正是因为JVM的存在，才使得JAVA被称为平台无关性的跨平台语言，JVM全称Java Virtual Machine（Java虚拟机），所有的java程序都是基于jvm运行的，它可以将字节码文件编译成机器码执行。它将java程序和操作系统进行了隔离，jvm其实是一种规范，就像是java体系中的接口，有不同的方案可以基于这个接口...]]></description><category></category></item><item><title><![CDATA[并发编程-ThreadLocal解析]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/107036756</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/107036756</guid><author>u010800201</author><pubDate>Tue, 30 Jun 2020 16:53:46 +0800</pubDate><description><![CDATA[首先，在解析ThreadLocal之前，我们首先要知道这东西是个什么玩意儿，ThreadLocal类顾名思义可以理解为线程本地变量。也就是说如果定义了一个ThreadLocal，每个线程往这个ThreadLocal中读写是线程隔离，互相之间不会影响的。它提供了一种将可变数据通过每个线程有自己的独立副本从而实现线程封闭的机制。

 下面，我来手写一个ThreadLocal的实现来理解一下它的原理：


public class ThreadLocal&lt;T&gt;
{
    pr...]]></description><category></category></item><item><title><![CDATA[基于ECC和RSA算法生成PKCS10请求和解析]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/92577464</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/92577464</guid><author>u010800201</author><pubDate>Mon, 17 Jun 2019 10:56:14 +0800</pubDate><description><![CDATA[最近公司有个项目用，需要基于PKCS10证书请求生成证书，然后最近也是找了资料学习了一下，在此记录一下：

1.首先是生成PKCS10证书请求：

RSA：


public static String genCSR()
			throws InvalidKeyException, NoSuchAlgorithmException,
			NoSuchProviderException, Sign...]]></description><category></category></item><item><title><![CDATA[使用spring cache和ehcache]]></title><link>https://blog.youkuaiyun.com/u010800201/article/details/88191931</link><guid>https://blog.youkuaiyun.com/u010800201/article/details/88191931</guid><author>u010800201</author><pubDate>Tue, 05 Mar 2019 17:40:17 +0800</pubDate><description><![CDATA[一.spring cache

 Spring Cache是作用在方法上的，其核心思想是这样的：当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中，等到下次利用同样的参数来调用该方法时将不再执行该方法，而是直接从缓存中获取结果进行返回。所以在使用Spring Cache的时候我们要保证我们缓存的方法对于相同的方法参数要有相同的返回结果。使用Spring Cache需...]]></description><category></category></item></channel></rss>