<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[醉后不知天在水，满船清梦压星河]]></title><description><![CDATA[简书博客 https://www.jianshu.com/u/98c41c8498e8]]></description><link>https://blog.youkuaiyun.com/catchhd5</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; catchhd5]]></copyright><item><title><![CDATA[AQS应用——ReentrantLock源码分析]]></title><link>https://blog.youkuaiyun.com/catchhd5/article/details/105314164</link><guid>https://blog.youkuaiyun.com/catchhd5/article/details/105314164</guid><author>catchhd5</author><pubDate>Sat, 04 Apr 2020 18:06:48 +0800</pubDate><description><![CDATA[前言
本文通过可重入锁ReentrantLock的源码分析，加深对aqs和ReentrantLock的理解
关于AQS相关的知识可以参考我的另一篇文章Java并发——AQS源码解析
先从使用上入手
构造方法
public ReentrantLock() {
    sync = new NonfairSync();
}

public ReentrantLock(boolean fair) {
 ...]]></description><category></category></item><item><title><![CDATA[Zookeeper 安装配置 伪集群搭建]]></title><link>https://blog.youkuaiyun.com/catchhd5/article/details/105180194</link><guid>https://blog.youkuaiyun.com/catchhd5/article/details/105180194</guid><author>catchhd5</author><pubDate>Sun, 29 Mar 2020 15:53:37 +0800</pubDate><description><![CDATA[本文总结一下在Linux上Zookeeper的安装和配置
安装
在zookeeper官网上推荐的清华镜像地址下载对应版本的zk安装包，以最新版本3.5.6举例，这里记住要下载带-bin的包

如果下载不带-bin的包，启动zk时可能会报错Starting zookeeper … FAILED TO START
查看日志会看到如下错误
Error: Could not find or load m...]]></description><category></category></item><item><title><![CDATA[Java并发——AQS源码解析]]></title><link>https://blog.youkuaiyun.com/catchhd5/article/details/105180131</link><guid>https://blog.youkuaiyun.com/catchhd5/article/details/105180131</guid><author>catchhd5</author><pubDate>Sun, 29 Mar 2020 15:51:37 +0800</pubDate><description><![CDATA[本文通过总结源码学习，来分析了解下AQS的工作原理
AQS是juc包锁实现的基础框架，研究juc包源码之前，AQS是必经之路
虽然说，平时项目中，我们几乎不会有自己去继承aqs实现锁的需要，但是通过源码了解aqs的机制和原理，有助于我们加深对各种锁的理解，以及出现问题时排查的思路
AbstractQueuedSynchronizer抽象队列同步器，CLH 锁

The wait queue is...]]></description><category></category></item><item><title><![CDATA[Java并发——ThreadPoolExecutor源码解析]]></title><link>https://blog.youkuaiyun.com/catchhd5/article/details/105180105</link><guid>https://blog.youkuaiyun.com/catchhd5/article/details/105180105</guid><author>catchhd5</author><pubDate>Sun, 29 Mar 2020 15:50:14 +0800</pubDate><description><![CDATA[本文总结一下对线程池源码的学习，基于jdk 1.8
什么是线程池

顾名思义线程池就是一个可以提供一组可复用线程的对象。线程池内部有阻塞队列，用来存放等待执行的任务。然后内部的线程来执行这些任务，线程会不断的从阻塞队列中获取任务来执行，而不是执行完一个任务就销毁。

线程池的作用
在高并发场景下，如果给每个任务都去创建一个线程来执行，结果就是大量的线程创建与销毁，系统的开销将会很大，影响应用的执行...]]></description><category></category></item><item><title><![CDATA[Java集合框架——ArrayList源码]]></title><link>https://blog.youkuaiyun.com/catchhd5/article/details/105180048</link><guid>https://blog.youkuaiyun.com/catchhd5/article/details/105180048</guid><author>catchhd5</author><pubDate>Sun, 29 Mar 2020 15:47:19 +0800</pubDate><description><![CDATA[本文通过源码来总结一下ArrayList
ArrayList
ArrayList 底层上是一个动态数组
属性
// 默认初始容量
private static final int DEFAULT_CAPACITY = 10;

// 指定容量为0时，数组为该值
private static final Object[] EMPTY_ELEMENTDATA = {};

// 调用无参构造方法，数...]]></description><category></category></item><item><title><![CDATA[spring boot 2.1.x log4j2 配置]]></title><link>https://blog.youkuaiyun.com/catchhd5/article/details/105180017</link><guid>https://blog.youkuaiyun.com/catchhd5/article/details/105180017</guid><author>catchhd5</author><pubDate>Sun, 29 Mar 2020 15:46:23 +0800</pubDate><description><![CDATA[本文通过项目中的日志配置问题，引出并总结一下spring boot 2.1.x 中 log4j2 的配置
现象
在服务器上调试项目的时候，发现日志文件生成的路径有问题，总是找不到日志位置，后来测试发现每次都在当前目录下生成 log/xxx.log
查看项目配置如下：
logging.level.com.xxx.yyy=INFO
logging.file=log/xxx.log

在resource...]]></description><category></category></item><item><title><![CDATA[Java中的回调方法]]></title><link>https://blog.youkuaiyun.com/catchhd5/article/details/105179984</link><guid>https://blog.youkuaiyun.com/catchhd5/article/details/105179984</guid><author>catchhd5</author><pubDate>Sun, 29 Mar 2020 15:45:10 +0800</pubDate><description><![CDATA[引言
回调方法大家经常听，但是可能有的同学并不是很清楚回调到底是怎么回事，本文以一个简单的例子，带你了解回调方法。
概念
所谓回调方法，就是在调用方把一个需要被回调的方法作为参数，传递给要调用的方法，被调用的方法执行完成后，通过该参数返回来调用此方法，作为参数传递的该方法就称作回调方法。
应用场景
在项目开发中，通常会碰到各个模块或者对象之间的消息传递，A模块的某些方法，需要在B模块满足某些条件...]]></description><category></category></item><item><title><![CDATA[斐波那契数列的递归与尾递归]]></title><link>https://blog.youkuaiyun.com/catchhd5/article/details/105179919</link><guid>https://blog.youkuaiyun.com/catchhd5/article/details/105179919</guid><author>catchhd5</author><pubDate>Sun, 29 Mar 2020 15:42:01 +0800</pubDate><description><![CDATA[引言
之前在lintcode上刷算法入门题，366题是求斐波那契数列，当时就想用递归应该很快就ac了，最后递归是没写错，但是提交报时间超限了，也就引出了这篇文章——尾递归。
测试
先来看一下，常规的斐波那契递归写法，假设第一项为0，第二项为1：
public int fibonacci(int n) {
    if(n == 1) {
	    return 0;
    }
    if(n ...]]></description><category></category></item><item><title><![CDATA[Integer中valueOf与parseInt区别及其缓存策略]]></title><link>https://blog.youkuaiyun.com/catchhd5/article/details/105178931</link><guid>https://blog.youkuaiyun.com/catchhd5/article/details/105178931</guid><author>catchhd5</author><pubDate>Sun, 29 Mar 2020 14:59:33 +0800</pubDate><description><![CDATA[本文来聊一下Integer中的两个常用的静态方法valueOf和parseInt，顺便引出基本类型包装类的缓存策略
前言
这篇文章的想法来源于一次代码检查，使用findbugs插件检查代码，然后报了如下信息(不属于bug，但是是一个更好的建议)

A boxed primitive is created from a String, just to extract the unboxed prim...]]></description><category></category></item></channel></rss>