<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[业精于勤荒于嬉 行成于思毁于随]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sinat_34976604</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sinat_34976604]]></copyright><item><title><![CDATA[HashMap源码解析-红黑树操作]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/90404647</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/90404647</guid><author>sinat_34976604</author><pubDate>Sun, 23 Jun 2019 10:58:56 +0800</pubDate><description><![CDATA[距离上一篇分析HashMap的文章已经过去一年了，今天偶尔翻到之前的那篇，还记得当时是打算另起一篇来分析链表的树化，以及树的链表化过程，结果这一拖就是一年]]></description><category></category></item><item><title><![CDATA[关于Arrays.asList的坑]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/90316301</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/90316301</guid><author>sinat_34976604</author><pubDate>Sat, 18 May 2019 15:50:11 +0800</pubDate><description><![CDATA[今天刷算法时遇到一个 Arrays.asList 的使用问题
        int[] arr0 = {2,5,6,7,1283};
        List list0 = Arrays.asList(arr0);
        System.out.println(list0.contains(1283));

返回false
        Integer[] arr = {2,5,6,...]]></description><category></category></item><item><title><![CDATA[记录些有意思的算法题]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/89051214</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/89051214</guid><author>sinat_34976604</author><pubDate>Sat, 18 May 2019 14:30:49 +0800</pubDate><description><![CDATA[将自己刷题中遇到的有意思的，有巧妙想法的题记录在这，持续更新…
LeetCode 338. Counting Bits
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ，计算其二进制数中的 1 的数目并将它们作为数组返回。
很容易就想到遍历然后每个数分别进行统计。
    public int[] countBits(int num) {
        int[] ...]]></description><category></category></item><item><title><![CDATA[JUC源码解析-ConcurrentSkipListMap]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/89913540</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/89913540</guid><author>sinat_34976604</author><pubDate>Sun, 12 May 2019 09:02:21 +0800</pubDate><description><![CDATA[单线程下若想使用有序的键值对，我们选用 TreeMap，若是考虑到线程安全问题，则可以使用 ConcurrentSkipListMap，它与ConcurrentSkipListSet之间的关系就如 TreeMap 与 TreeSet 之家的关系一样，set 由 map来实现，本篇主要来分析 ConcurrentSkipListMap。
底层数据结构是 跳表。

...]]></description><category></category></item><item><title><![CDATA[EventLoop和线程模型]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/89235892</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/89235892</guid><author>sinat_34976604</author><pubDate>Sat, 13 Apr 2019 01:51:25 +0800</pubDate><description><![CDATA[这是《Netty实战》，《Netty权威指南》的读书笔记。
线程模型确定了代码的执行方式，所以理解所采用的并发模型的影响很重要。
线程池缓存和重用 Thread 极大地提高了性能，但它并不能消除由上下文切换所带来的开销，随着线程数量的增加，高负载下情况会变得越来越糟。接下来看看Netty是如何处理的。
EventLoop 接口
运行任务来处理在连接的生命周期内发生的事件是任何网络框架的基本功能。与...]]></description><category></category></item><item><title><![CDATA[Reactor模式与Netty]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/89224051</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/89224051</guid><author>sinat_34976604</author><pubDate>Fri, 12 Apr 2019 12:33:41 +0800</pubDate><description><![CDATA[在netty的线程模型中，bossGroup只负责请求的转发，workerGroup是具体的数据处理，其实netty使用的是Reactor(响应器)的设计模式。
一篇文章对这种模式做了非常细致的介绍,《Scalable IO in Java》 ，这篇文章的作者是 Doug Lea！！！

大多数的网络服务都是下面的流程：

读取请求
解码
业务逻辑处理
编码响应
发送响应

典型的设计实现如下：
...]]></description><category></category></item><item><title><![CDATA[ThreadLocal源码解析]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/89101171</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/89101171</guid><author>sinat_34976604</author><pubDate>Tue, 09 Apr 2019 11:05:42 +0800</pubDate><description><![CDATA[什么是ThreadLocal？它是属于线程自己的小仓库。关于它的使用与介绍看这一篇：ThreadLocal的介绍与使用
关于ThreadLocal的原理，理清四个角色关系：Thread，ThreadLocal，ThreadLocalMap，Entry：
​​​​​​
在Thread中有个变量指向ThreadLocalMap
    ThreadLocal.ThreadLocalMap thread...]]></description><category></category></item><item><title><![CDATA[ThreadLocal的介绍与使用]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/89081889</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/89081889</guid><author>sinat_34976604</author><pubDate>Mon, 08 Apr 2019 09:49:52 +0800</pubDate><description><![CDATA[本篇是《图解Java多线程设计模式》第十一章的读书笔记。
有一个储物室，里面有很多储物柜。每个人拿着自己的钥匙去开自己的储物柜，虽然进同一个储物室，但彼此互不干扰。这就是 Thread-Local Storage 线程中的局部存储空间。
来看一个例子：每个线程将信息打印到自己的日志文件中。
TSLog ：打印类，每个线程都有自己的 TSLog 对象，向自己的日志文件中打印信息。
public cl...]]></description><category></category></item><item><title><![CDATA[Java并发之Future模式]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/89075432</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/89075432</guid><author>sinat_34976604</author><pubDate>Sun, 07 Apr 2019 21:25:02 +0800</pubDate><description><![CDATA[本篇是《图解Java多线程设计模式》第九章的读书笔记。
Future的意思是未来，假设有一个方法需要花费很长的时间才能获取到运行结果，那么与其一直等待不如先去忙别的，等你完成我再来拿。
来看看示例代码：

先来看下各个类之间的关系：

Data接口
RealData 与 FutureData 实现的接口
public interface Data {
    String getContent()...]]></description><category></category></item><item><title><![CDATA[理解volatile]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/88773206</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/88773206</guid><author>sinat_34976604</author><pubDate>Sat, 06 Apr 2019 06:21:48 +0800</pubDate><description><![CDATA[特性
可见性：对一个volatile变量的读，总能看到任意线程对这个volatile变量最后的写。
原子性：对任意单个volatile变量的读/写具有原子性。
如何实现的？
对volatile的写操作其汇编代码会多出一步带lock前缀的指令：
0x01a3de24: **lock** addl $0x0,(%esp);

该指令在多核处理器下引发两件事情：
1，将当前处理器缓存行的数据写回到系统内...]]></description><category></category></item><item><title><![CDATA[数组相关算法题]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/82393421</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/82393421</guid><author>sinat_34976604</author><pubDate>Sat, 06 Apr 2019 06:19:39 +0800</pubDate><description><![CDATA[题一：

128.：Longest Consecutive Sequence 
要求是O（n），所以不能使用排序，那么就得考虑辅助。利用Map，key为num，value为其连续长度，每次之更新这个连续序列的首尾两个位置的value值。



    public int longestConsecutive(int[] nums) {
        Map&amp;amp;amp;amp;amp;amp;lt;Integer, Intege...]]></description><category></category></item><item><title><![CDATA[二分法相关题目]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/89039601</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/89039601</guid><author>sinat_34976604</author><pubDate>Fri, 05 Apr 2019 07:58:35 +0800</pubDate><description><![CDATA[一般用法：
public int binarySearch(int[] nums, int key) {
    int l = 0, h = nums.length - 1;
    while (l &lt;= h) {
        int m = l + (h - l) / 2; // 防止l+h越界
        if (nums[m] == key) {
            r...]]></description><category></category></item><item><title><![CDATA[Dubbo源码解析-ExtensionFactory]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/86757638</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/86757638</guid><author>sinat_34976604</author><pubDate>Thu, 28 Mar 2019 16:02:22 +0800</pubDate><description><![CDATA[ExtensionFactory是拓展实现类工厂，来看看他在ExtentionLoader中的使用。
ExtensionFactory对象在ExtentionLoader的构造器中创建。
    private ExtensionLoader(Class&amp;amp;lt;?&amp;amp;gt; type) {
        this.type = type;
        objectFactory = (type...]]></description><category></category></item><item><title><![CDATA[Dubbo源码解析-SPI机制]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/86747089</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/86747089</guid><author>sinat_34976604</author><pubDate>Thu, 28 Mar 2019 15:20:53 +0800</pubDate><description><![CDATA[版本2.7.1
SPI(service providerinterface)机制，即我们定义了服务接口标准，让厂商去实现，关于Java的SPI机制
Dubbo的SPI主要改进了JDK的SPI实现：

1，JDK标准的SPI会一次性实例化扩展点所有实现，如果有扩展实现初始化很耗时，但如果没用上也加载，会很浪费资源。
2，如果扩展点加载失败，连扩展点的名称都拿不到了。比如：JDK标准的ScriptEn...]]></description><category></category></item><item><title><![CDATA[Netty心跳机制的使用实例]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/88790643</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/88790643</guid><author>sinat_34976604</author><pubDate>Mon, 25 Mar 2019 12:30:25 +0800</pubDate><description><![CDATA[我们将客户端对服务端发送的数据封装成MyRequest对象，服务端的回应封装成MyResponse对象，我们用Protostuff来序列化，底层通信实现采用Netty，实现心跳机制，当客户端一段时间没有向服务端发出请求就主动发一个PING过去，告诉服务端自己还活着，服务端接收后就回个PONG；服务端一段时间没收到请求就断开与客户端的长连接。
关于Protostuff的使用看这篇Protostuff...]]></description><category></category></item><item><title><![CDATA[Protostuff序列化框架的使用及Objenesis的使用]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/88789283</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/88789283</guid><author>sinat_34976604</author><pubDate>Mon, 25 Mar 2019 11:32:10 +0800</pubDate><description><![CDATA[import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;

import java.util.Map;
import java.util.concurrent.Co...]]></description><category></category></item><item><title><![CDATA[BeanDefinitionRegistryPostProcessor与动态代理配合使用例子]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/88785177</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/88785177</guid><author>sinat_34976604</author><pubDate>Mon, 25 Mar 2019 07:12:18 +0800</pubDate><description><![CDATA[我们想要实现这样一种功能：
我们自定义了一个注解@MyReference，
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyReference{
}

在项目里被它注解的字段是就是我们要代理的类，我们希望在Spring启动时将代理类注入到这些被该注解标识的字段。
那么有两点需要解决...]]></description><category></category></item><item><title><![CDATA[JUC源码解析文章目录]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/88762549</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/88762549</guid><author>sinat_34976604</author><pubDate>Sat, 23 Mar 2019 15:56:32 +0800</pubDate><description><![CDATA[基础知识：
原子操作的实现：CAS与锁
JMM与happens-before
Synchronized
ThreadLocal
同步器
J.U.C之基——AQS
锁
ReentrantLock
Condition
CountDownLatch
Semaphore
CyclicBarrier
ReentrantReadWriteLock
并发容器
CopyOnWriteArrayList
Conc...]]></description><category></category></item><item><title><![CDATA[JMM与happens-before]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/88762147</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/88762147</guid><author>sinat_34976604</author><pubDate>Sat, 23 Mar 2019 15:37:59 +0800</pubDate><description><![CDATA[首先关于Java并发的通信机制是基于共享内存实现的，线程之间共享程序的公共状态，通过写-读内存中的公共状态进行隐式通信，这对程序员是透明的，我们需要理解其工作机制，以防止内存可见性问题，从而编写出正确同步的代码。
同步指用于控制不同线程间操作发生相对顺序的机制，我们需要显式的指定方法或代码块需要在线程之间互斥执行。
由于Java的这种通信方式，一个线程要跟另一个通信，何时将共享变量刷新到内存，另一...]]></description><category></category></item><item><title><![CDATA[Synchronized]]></title><link>https://blog.youkuaiyun.com/sinat_34976604/article/details/88757084</link><guid>https://blog.youkuaiyun.com/sinat_34976604/article/details/88757084</guid><author>sinat_34976604</author><pubDate>Sat, 23 Mar 2019 10:35:21 +0800</pubDate><description><![CDATA[我将《Java并发编程的艺术》里关于synchronized的相关知识总结为如下的思维导图，更清楚的解释请去看该书的2.2章。


]]></description><category></category></item></channel></rss>