<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[掀衣怒码]]></title><description><![CDATA[求知若渴，虚心若愚]]></description><link>https://blog.youkuaiyun.com/AngryCoding</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; AngryCoding]]></copyright><item><title><![CDATA[mac下fleet启动项目报错gradlew Permission denied (os error 13)]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/127308397</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/127308397</guid><author>AngryCoding</author><pubDate>Thu, 13 Oct 2022 20:11:01 +0800</pubDate><description><![CDATA[fleet尝鲜]]></description><category></category></item><item><title><![CDATA[工作后学习心得]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/123590427</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/123590427</guid><author>AngryCoding</author><pubDate>Sat, 19 Mar 2022 10:52:48 +0800</pubDate><description><![CDATA[以前总是以为老师教的不如自己学的。很久一段时间都是自学为主。而且做的试卷只要我没做完的，或者没有做出来的坚决不会听老师讲的。以至于后来试卷越来越多，自己的精力完全跟不上老师的进度了。
现在由于工作的原因，一直需要学习东西，又有了不同的感触。一个好的老师可以给你指引方向，做正确的引导，防止你在大片的知识里被某一个细节困住。快速找到一个宏观的纲要，提高学习效率。而且大部分情况下并不是要把所有的都吃透彻的，你只需要弄懂自己需要的即可。
但是现在一个好的老师并不好找。这个老师可能是你的同事，同学，朋友，书本。比在学]]></description><category></category></item><item><title><![CDATA[mac idea设置内存参数后启动不了问题解决]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/119730852</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/119730852</guid><author>AngryCoding</author><pubDate>Mon, 16 Aug 2021 13:11:50 +0800</pubDate><description><![CDATA[1.访达=&gt;应用程序=&gt;程序上右击显示包内容=&gt;找到macos=》idea脚本

2.双击脚本。
会在命令窗口看到异常描述信息；在描述信息中可以找到你配置错的配置文件路径。拷贝下来
3.通过访达找到该文件，修改正确即可
注意这里的配置文件不是bin路径下面的所以只能这样找

...]]></description><category></category></item><item><title><![CDATA[LongAdder原理解析]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/119715551</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/119715551</guid><author>AngryCoding</author><pubDate>Sun, 15 Aug 2021 16:30:57 +0800</pubDate><description><![CDATA[首先说下他的作用
保证原子性的并发计数器，相较于基于cas的AtomicLong该实现性能更高；
它内部实现了一个竞争单元列表cells
原理是它在并发压力较大的时候会根据线程probe（一个变量，用来取模的）去路由到cells的某个单元上去竞争计数；
如果假设为收费站的话，AtomicLong就是单个窗口在工作；LongAdder就是一个主窗口和n个子窗口在工作；当线程发现主窗口有阻塞的时候会转而去尝试在各个子窗口去竞争；而且每个窗口又各自都是基于cas的原子操作；通过这样的方式减少了线程等待时间；
lo]]></description><category></category></item><item><title><![CDATA[求最小差值算法题]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/119715323</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/119715323</guid><author>AngryCoding</author><pubDate>Sun, 15 Aug 2021 16:24:21 +0800</pubDate><description><![CDATA[给定两个数组，找到一对数字（两个数组各取一个），他们的差值最小。返回这个最小差。
输入:
arrayOne = [-1, 5, 10, 20, 28, 3]
arrayTwo = [26, 134, 135, 15, 17]
输出: 2
解题思路：假设数组中的值为海拔高度；需要在两座山选择两个差值最小的信号站，来接受信号。这样信号最稳定；
开始的时候两个人都在两座山的最低位置；这个时候需要往上爬的那一个肯定是站的低点那一个。每次移动都记录一个当前最低值。直到有一方攀爬结束；这样就能找到一个最低值；
这里为什]]></description><category></category></item><item><title><![CDATA[jdk1.7中hashMap扩容导致死循环问题原因分析]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/117395198</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/117395198</guid><author>AngryCoding</author><pubDate>Sun, 30 May 2021 12:39:25 +0800</pubDate><description><![CDATA[导致死循环的根源是在resize的时候进行元素转移的时候有概率会出现；
先说结论：导致问题的根本原因是使用头插法；
先贴出来源码：
但是哪怕你不看源码也没关系；
void transfer(Entry[] newTable, boolean rehash) {
    int newCapacity = newTable.length;
    for (Entry&lt;K,V&gt; e : table) {
        while(null != e) {
            Entry&lt]]></description><category></category></item><item><title><![CDATA[foolflow用思维组织代码]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/116933224</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/116933224</guid><author>AngryCoding</author><pubDate>Mon, 17 May 2021 14:49:44 +0800</pubDate><description><![CDATA[foolflow
介绍
傻瓜工作流；放弃复杂设计，放弃bpmn规范，傻瓜式，足够简单；类似一个有限状态机，比状态机强,介于状态机和工作流之间。
在应对一些状态较多的简单场景，又不想引入繁重的工作流引擎的时候可以使用。不用学习bpmn规范，没有心智负担;使用后使代码条理性更强，整个业务的各个阶段的代码不再散落在项目的各个位置。方便管理
模型
由点node和line来组成一个工作流，整个流程驱动方式为通过当前节点+动作的方式进行驱动;支持单任务和批量任务；
业务逻辑通过ActionExecutor接口进行实现
]]></description><category></category></item><item><title><![CDATA[rocketMq源码启动]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115908869</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115908869</guid><author>AngryCoding</author><pubDate>Tue, 20 Apr 2021 21:35:39 +0800</pubDate><description><![CDATA[启动配置ROCKETMQ_HOME为namesrv配置文件conf所在的父目录地址；
这里为了方便管理就放在namesrv源码路径下；
创建一个conf目录用于存配置文件；

]]></description><category></category></item><item><title><![CDATA[spring源码解读-第二部分面想切面编程]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115435853</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115435853</guid><author>AngryCoding</author><pubDate>Thu, 15 Apr 2021 22:38:54 +0800</pubDate><description><![CDATA[aop

]]></description><category></category></item><item><title><![CDATA[maven排包排不掉问题]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115711150</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115711150</guid><author>AngryCoding</author><pubDate>Wed, 14 Apr 2021 22:25:08 +0800</pubDate><description><![CDATA[现象： 遇到了一个比较老的项目。项目能启动起来。但是maven构建的时候总是会去加载一个仓库中不存在的废弃的jar包版本；项目中又有别的jar包也依赖了这个jar。然后还有好多项目模块也依赖这个jar。所以mave视图里面一片红。
笔者又是个洁癖的码农。怎么能忍呢。结果就去尝试看看哪个jar包依赖了这个不存在的jar。结果通过分析依赖关系找了半天，发现所有依赖这个问题包的jar的pom里面的版本又都不是这个有问题的版本；然后试着排包。排除了之后发现还是不行。依旧会去加载这个包。当时挺郁闷的。后来把项目的po]]></description><category></category></item><item><title><![CDATA[Spring源码解读-第一部分核心部分]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115591373</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115591373</guid><author>AngryCoding</author><pubDate>Sun, 11 Apr 2021 11:33:40 +0800</pubDate><description><![CDATA[第一部分讲解bean加载到ioc容器的整个过程。

]]></description><category></category></item><item><title><![CDATA[spring源码解读-6.bean生命周期]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115497437</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115497437</guid><author>AngryCoding</author><pubDate>Sat, 10 Apr 2021 23:50:44 +0800</pubDate><description><![CDATA[我们知道bean在spring中有两个大的状态。实例化，初始化；那么在bean成长过程中我们是不是可以进行干预，或者进行观察呢？自己生的孩子不可能都不管不问吧。所以在bean成长的各个环节中我们都有办法去干预，或者收到通知。spring通过暴露几个接口的方式来赋予你这个能力；
今天的主角是BeanPostProcessor；看下长什么样子先
public interface BeanPostProcessor {
	Object postProcessBeforeInitialization(Object ]]></description><category></category></item><item><title><![CDATA[spring源码解读-5.容器生命周期之修改图纸]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115497150</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115497150</guid><author>AngryCoding</author><pubDate>Wed, 07 Apr 2021 21:52:50 +0800</pubDate><description><![CDATA[spring启动容器的时候允许在加载完成BeanDefinition(我称之为bean的图纸)对bean定义元数据信息进行修改；是通过一个叫做BeanFactoryPostProcessor的接口来实现的；
代码位置在refresh() 里面调用invokeBeanFactoryPostProcessors()的方法中；
代码逻辑不复杂，自己研究吧。因为使用场景很少，所以不多讲什么了。自己看看吧
	public static void invokeBeanFactoryPostProcessors(
			]]></description><category></category></item><item><title><![CDATA[spring源码解读-4.把创建的bean丢到容器中]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115435800</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115435800</guid><author>AngryCoding</author><pubDate>Tue, 06 Apr 2021 23:02:04 +0800</pubDate><description><![CDATA[这里呢，说丢到容器中，其实单例bean更有探讨价值；现在主要就来看看单例bean是如何维护在容器中的；
大家应该都听过三级缓存。循环依赖这些概念。这里呢就来揭开三级缓存的面纱。以及看看spring中如何解决循环依赖的；

...]]></description><category></category></item><item><title><![CDATA[spring源码解读-3.初始化维护依赖关系]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115435756</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115435756</guid><author>AngryCoding</author><pubDate>Mon, 05 Apr 2021 21:35:51 +0800</pubDate><description><![CDATA[上一节我们知道spring创建bean实例的源码所在了。那么现在来看看它是如何对bean进行初始化，维护它的依赖的；
这里还得回去去看那个doCreateBean的代码；

]]></description><category></category></item><item><title><![CDATA[spring源码解读-2.根据图纸创建bean实例]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115432328</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115432328</guid><author>AngryCoding</author><pubDate>Sun, 04 Apr 2021 20:53:04 +0800</pubDate><description><![CDATA[首先，找到容器刷新方法refresh();上一篇知道在执行完obtainFreshBeanFactory方法之后我们的bean定义信息已经加载出来，存在了
DefaultListableBeanFactory（它是同时也是一个BeanDefinitionRegistry）的默认实现中；
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

今天继续开始引路，看看spring的bean是如何创建的；
spring容器会]]></description><category></category></item><item><title><![CDATA[spring源码解读开篇-1.bean图纸加载]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115423251</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115423251</guid><author>AngryCoding</author><pubDate>Sun, 04 Apr 2021 14:52:02 +0800</pubDate><description><![CDATA[好多看源码的小伙伴，像是在玩一个没有主线指引的游戏，在诺大的地图上到处碰壁，时不时钻进死胡同，一次次消磨掉了耐心，失去了再玩下去的勇气；这次呢，我来做你的引导npc；
我来说说我的看法
其实坚持不下去，真的不怪你。
首先：spring已经发展很多年了，你不是从第一行代码看起。
其次：先有了设计思想，才有代码实现。而反过来从代码去找思想，就是反人类的做法
再者：代码量繁多，你不需要看完所有的代码。只需要看懂关键部分，看懂关键部分之后，其余的细枝末节需要用的时候再去看（借助文档等等工具），你会很轻松的看懂他们
]]></description><category></category></item><item><title><![CDATA[java快速插入海量数据]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115382072</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115382072</guid><author>AngryCoding</author><pubDate>Fri, 02 Apr 2021 16:07:47 +0800</pubDate><description><![CDATA[依赖jar包
        &lt;dependency&gt;
            &lt;groupId&gt;mysql&lt;/groupId&gt;
            &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
            &lt;version&gt;8.0.16&lt;/version&gt;
        &lt;/dependency&gt;

java插入工具类

import java.s]]></description><category></category></item><item><title><![CDATA[Spring三级缓存解决循环依赖必要性研讨]]></title><link>https://blog.youkuaiyun.com/AngryCoding/article/details/115387286</link><guid>https://blog.youkuaiyun.com/AngryCoding/article/details/115387286</guid><author>AngryCoding</author><pubDate>Fri, 02 Apr 2021 11:36:40 +0800</pubDate><description><![CDATA[由于spring三级缓存处理逻辑的直接读源码比较难理解，所以一气之下按照方法压栈顺序整理了一张图供大家参考；图中各个环节标注了序号，我会按照序号来给你标注出代码位置；可以看到整个过程中bean在三级缓存中的状态；
注： 虚线的框表示入栈后立马出栈，但是为了对称性，画在对称的位置

关于三级缓存必要性的讨论
图中可以看到第2步那里是往第三级缓存放入了一个包含对A早期引用进行操作的工厂函数。在第10步的时候才取出来这个函数进行调用。那么如果我直接在第2步就执行这个函数的逻辑，然后把A直接放到2级缓存，废除掉第3]]></description><category></category></item></channel></rss>