<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[java_kider的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/java_kider</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; java_kider]]></copyright><item><title><![CDATA[LockSupport]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/116454869</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/116454869</guid><author>java_kider</author><pubDate>Thu, 06 May 2021 16:17:40 +0800</pubDate><description><![CDATA[javadoc

用于创建锁和其他同步类的基本线程阻塞原语。

这个类与每个使用它的线程相关联，一个许可证（在Semaphore类的意义上）。如果许可证可用，则呼叫park将park返回，在此过程中消耗它;否则可能会阻止。

调用unpark使许可证可用，如果尚不可用。（与信号量不同，许可证不能累积，最多只有一个。）

方法park和unpark提供了阻止和解除阻塞线程的有效手段，该方法不会遇到导致不推荐使用的方法Thread.suspend和Thread.resume目的不能使用的问题：

一个...]]></description><category></category></item><item><title><![CDATA[常见代码重构技巧（非常实用）]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/116451241</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/116451241</guid><author>java_kider</author><pubDate>Thu, 06 May 2021 12:31:24 +0800</pubDate><description><![CDATA[常见代码重构技巧

关于重构

为什么要重构



项目在不断演进过程中，代码不停地在堆砌。如果没有人为代码的质量负责，代码总是会往越来越混乱的方向演进。当混乱到一定程度之后，量变引起质变，项目的维护成本已经高过重新开发一套新代码的成本，想要再去重构，已经没有人能做到了。

造成这样的原因往往有以下几点：

编码之前缺乏有效的设计
	成本上的考虑，在原功能堆砌式编程
	缺乏有效代码质量监督机制
对于此类问题，业界已有有很好的解决思路：通过持续不断的重构将代码中的“坏味道”清除掉。

什么是重构

重构一书的]]></description><category></category></item><item><title><![CDATA[AQS 源码解读]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/115820492</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/115820492</guid><author>java_kider</author><pubDate>Sun, 18 Apr 2021 12:30:59 +0800</pubDate><description><![CDATA[1.先看一下类图





2.开始跟代码

找一个入口



new ReentrantLock()默认是非公平锁,false是非公平



进入lock.lock(),在ReentrantLock中的实现



看到是sync的lock方法 Sync是ReentrantLock的子类



找抽象方法lock()在非公平锁中的实现




compareAndSetState(0,1) 如果状态是0 更新为 1


setExclusiveOwnerThread(Thread.currentThr...]]></description><category></category></item><item><title><![CDATA[面试官问：ZooKeeper是强一致的吗？怎么实现的？]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/112908781</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/112908781</guid><author>java_kider</author><pubDate>Wed, 20 Jan 2021 19:27:21 +0800</pubDate><description><![CDATA[Zookeeper通过ZAB保证分布式事务的最终一致性。

ZAB全称Zookeeper Atomic Broadcast（ZAB，Zookeeper原子消息广播协议）


	ZAB是一种专门为Zookeeper设计的一种支持崩溃恢复的原子广播协议，是Zookeeper保证数据一致性的核心算法。ZAB借鉴了Paxos算法，但它不是通用的一致性算法，是特别为Zookeeper设计的。
	
	
	基于ZAB协议，Zookeeper实现了⼀种主备模式的系统架构来保持集群中各副本之间的数据的⼀致性，表现形式...]]></description><category></category></item><item><title><![CDATA[02.Netty入门-架构设计]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/112304020</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/112304020</guid><author>java_kider</author><pubDate>Fri, 08 Jan 2021 15:19:34 +0800</pubDate><description><![CDATA[上节回顾：

I/O的四种模型

同步阻塞IO模型
	同步非阻塞IO模型
	IO多路复用模型
	异步IO模型
————————————————————————————————————————————————————————————

1、基本线程模型介绍


	目前存在的线程模型

	传统阻塞I/O服务模型
		Reactor模式
	
	
	线程模型-Reactor模式

	单Reactor-单线程
		单Reactor-多线程
		主从Reactor-多线程
	
	
	Netty线程模型

	
		
Ne]]></description><category></category></item><item><title><![CDATA[推荐&搜索&广告&用户画像&深度学习-有时间看看]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/111956692</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/111956692</guid><author>java_kider</author><pubDate>Wed, 30 Dec 2020 11:32:16 +0800</pubDate><description><![CDATA[https://zhuanlan.zhihu.com/p/51015148
]]></description><category></category></item><item><title><![CDATA[MySQL InnoDB In-Memory Structures  Buffer Pool]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/111362526</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/111362526</guid><author>java_kider</author><pubDate>Fri, 18 Dec 2020 15:05:11 +0800</pubDate><description><![CDATA[官方文档：https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html



Buffer Pool

缓冲池是主内存中的一个区域，在InnoDB访问表和索引数据时会在其中进行高速缓存。缓冲池允许直接从内存中处理经常使用的数据，从而加快了处理速度。在专用服务器上，通常将多达80％的物理内存分配给缓冲池。

为了提高大容量读取操作的效率，缓冲池被分为多个页面，这些页面可能包含多个行。为了提高缓存管理的效率，缓冲池被实现为页面的链接列表...]]></description><category></category></item><item><title><![CDATA[01.Netty入门-IO模型浅析]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110450388</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110450388</guid><author>java_kider</author><pubDate>Tue, 01 Dec 2020 20:18:22 +0800</pubDate><description><![CDATA[写在前面

很多的小伙伴，被java IO 模型，搞得有点儿晕，一会儿是4种模型，一会儿又变成了5种模型。

很多的小伙伴，也被nio这个名词搞晕了，一会儿java 的nio 不叫 非阻塞io，一会儿java nio 又是非阻塞io，到底是啥呢？

很多的小伙伴，被异步和非阻塞搞晕了。都非阻塞了，难道不是异步的吗？这这，好难呀。

此文，给各位小伙伴，起底一下，java的四大IO模型。

1.1. Java IO读写原理

无论是Socket的读写还是文件的读写，在Java层面的应用开发或者是linux系统]]></description><category></category></item><item><title><![CDATA[Lucene解析 - IndexWriter]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110113568</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110113568</guid><author>java_kider</author><pubDate>Wed, 25 Nov 2020 10:02:05 +0800</pubDate><description><![CDATA[前言

在上一篇文章我们介绍了Lucene的基本概念，在本篇文章我们将深入Lucene中最核心的类之一IndexWriter，来探索Lucene中数据写入和索引构建的整个过程。

IndexWriter


// initialization
Directory index = new NIOFSDirectory(Paths.get("/index"));
IndexWriterConfig config = new IndexWriterConfig();
IndexWriter writer = ne]]></description><category></category></item><item><title><![CDATA[Lucene 查询原理]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110112740</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110112740</guid><author>java_kider</author><pubDate>Wed, 25 Nov 2020 09:59:09 +0800</pubDate><description><![CDATA[前言

Lucene 是一个基于 Java 的全文信息检索工具包，目前主流的搜索系统Elasticsearch和solr都是基于lucene的索引和搜索能力进行。想要理解搜索系统的实现原理，就需要深入lucene这一层，看看lucene是如何存储需要检索的数据，以及如何完成高效的数据检索。

在数据库中因为有索引的存在，也可以支持很多高效的查询操作。不过对比lucene，数据库的查询能力还是会弱很多，本文就将探索下lucene支持哪些查询，并会重点选取几类查询分析lucene内部是如何实现的。为了方便大家理]]></description><category></category></item><item><title><![CDATA[Lucene解析 - 基本概念]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110112046</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110112046</guid><author>java_kider</author><pubDate>Wed, 25 Nov 2020 09:56:00 +0800</pubDate><description><![CDATA[前言

Apache Lucene是一个开源的高性能、可扩展的信息检索引擎，提供了强大的数据检索能力。Lucene已经发展了很多年，其功能越来越强大，架构也越来越精细。它目前不仅仅能支持全文索引，也能够提供多种其他类型的索引方式，来满足不同类型的查询需求。

基于Lucene的开源项目有很多，最知名的要属Elasticsearch和Solr，如果说Elasticsearch和Solr是一辆设计精美、性能卓越的跑车，那Lucene就是为其提供强大动力的引擎。为了驾驭这辆跑车让它跑的更快更稳定，我们需要对它的引]]></description><category></category></item><item><title><![CDATA[Elasticsearch内核解析 - 查询篇]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110111262</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110111262</guid><author>java_kider</author><pubDate>Wed, 25 Nov 2020 09:50:21 +0800</pubDate><description><![CDATA[读操作

实时性和《Elasticsearch内核解析 - 写入篇》中的“写操作”一样，对于搜索而言是近实时的，延迟在100ms以上，对于NoSQL则需要是实时的。

一致性指的是写入成功后，下次读操作一定要能读取到最新的数据。对于搜索，这个要求会低一些，可以有一些延迟。但是对于NoSQL数据库，则一般要求最好是强一致性的。

结果匹配上，NoSQL作为数据库，查询过程中只有符合不符合两种情况，而搜索里面还有是否相关，类似于NoSQL的结果只能是0或1，而搜索里面可能会有0.1，0.5，0.9等部分匹配或者]]></description><category></category></item><item><title><![CDATA[Elasticsearch内核解析 - 写入篇]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110111115</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110111115</guid><author>java_kider</author><pubDate>Wed, 25 Nov 2020 09:46:53 +0800</pubDate><description><![CDATA[目前的Elasticsearch有两个明显的身份，一个是分布式搜索系统，另一个是分布式NoSQL数据库，对于这两种不同的身份，读写语义基本类似，但也有一点差异。



写操作

实时性：
	搜索系统的Index一般都是NRT（Near Real Time），近实时的，比如Elasticsearch中，Index的实时性是由refresh控制的，默认是1s，最快可到100ms，那么也就意味着Index doc成功后，需要等待一秒钟后才可以被搜索到。
	NoSQL数据库的Write基本都是RT（Real Tim]]></description><category></category></item><item><title><![CDATA[Elasticsearch内核解析 - 数据模型篇]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110095667</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110095667</guid><author>java_kider</author><pubDate>Tue, 24 Nov 2020 20:44:43 +0800</pubDate><description><![CDATA[Elasticsearch是一个实时的分布式搜索和分析引擎，它可以帮助我们用很快的速度去处理大规模数据，可以用于全文检索、结构化检索、推荐、分析以及统计聚合等多种场景。

Elasticsearch是一个建立在全文搜索引擎库Apache Lucene 基础上的分布式搜索引擎，Lucene最早的版本是2000年发布的，距今已经18年，是当今最先进，最高效的全功能开源搜索引擎框架，众多搜索领域的系统都基于Lucene开发，比如Nutch，Solr和Elasticsearch等。Elasticsearch第一个版]]></description><category></category></item><item><title><![CDATA[从Elasticsearch来看分布式系统架构设计]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110095323</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110095323</guid><author>java_kider</author><pubDate>Tue, 24 Nov 2020 20:41:07 +0800</pubDate><description><![CDATA[分布式系统类型多，涉及面非常广，不同类型的系统有不同的特点，批量计算和实时计算就差别非常大。这篇文章中，重点会讨论下分布式数据系统的设计，比如分布式存储系统，分布式搜索系统，分布式分析系统等。

我们先来简单看下Elasticsearch的架构。

Elasticsearch 集群架构

Elasticsearch是一个非常著名的开源搜索和分析系统，目前被广泛应用于互联网多种领域中，尤其是以下三个领域特别突出。一是搜索领域，相对于solr，真正的后起之秀，成为很多搜索系统的不二之选。二是Json文档数据库，]]></description><category></category></item><item><title><![CDATA[《我要进大厂》- MQ夺命连环11问]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110089993</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110089993</guid><author>java_kider</author><pubDate>Tue, 24 Nov 2020 18:15:08 +0800</pubDate><description><![CDATA[你们为什么使用mq？具体的使用场景是什么？

mq的作用很简单，削峰填谷。以电商交易下单的场景来说，正向交易的过程可能涉及到创建订单、扣减库存、扣减活动预算、扣减积分等等。每个接口的耗时如果是100ms，那么理论上整个下单的链路就需要耗费400ms，这个时间显然是太长了。



如果这些操作全部同步处理的话，首先调用链路太长影响接口性能，其次分布式事务的问题很难处理，这时候像扣减预算和积分这种对实时一致性要求没有那么高的请求，完全就可以通过mq异步的方式去处理了。同时，考虑到异步带来的不一致的问题，我们可以]]></description><category></category></item><item><title><![CDATA[《我要进大厂》- Redis夺命连环11问]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110089939</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110089939</guid><author>java_kider</author><pubDate>Tue, 24 Nov 2020 18:13:13 +0800</pubDate><description><![CDATA[说说Redis基本数据类型有哪些吧


	字符串：redis没有直接使用C语言传统的字符串表示，而是自己实现的叫做简单动态字符串SDS的抽象类型。C语言的字符串不记录自身的长度信息，而SDS则保存了长度信息，这样将获取字符串长度的时间由O(N)降低到了O(1)，同时可以避免缓冲区溢出和减少修改字符串长度时所需的内存重分配次数。
	
	
	链表linkedlist：redis链表是一个双向无环链表结构，很多发布订阅、慢查询、监视器功能都是使用到了链表来实现，每个链表的节点由一个listNode结构来表示，每个]]></description><category></category></item><item><title><![CDATA[《我要进大厂》- Dubbo普普通通9问]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110089904</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110089904</guid><author>java_kider</author><pubDate>Tue, 24 Nov 2020 18:11:42 +0800</pubDate><description><![CDATA[Dubbo本身并不复杂，而且官方文档写的非常清楚详细，面试中dubbo的问题一般不会很多，从分层到工作原理、负载均衡策略、容错机制、SPI机制基本就差不多了，最大的一道大题一般就是怎么设计一个RPC框架了，但是如果你工作原理分层都搞明白了这个问题其实也就相当于回答了不是吗。

说说Dubbo的分层？

从大的范围来说，dubbo分为三层，business业务逻辑层由我们自己来提供接口和实现还有一些配置信息，RPC层就是真正的RPC调用的核心层，封装整个RPC的调用过程、负载均衡、集群容错、代理，remoti]]></description><category></category></item><item><title><![CDATA[《我要进大厂》-JVM夺命连环10问]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110089810</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110089810</guid><author>java_kider</author><pubDate>Tue, 24 Nov 2020 18:10:04 +0800</pubDate><description><![CDATA[说说JVM的内存布局？



Java虚拟机主要包含几个区域：

堆：堆Java虚拟机中最大的一块内存，是线程共享的内存区域，基本上所有的对象实例数组都是在堆上分配空间。堆区细分为Yound区年轻代和Old区老年代，其中年轻代又分为Eden、S0、S1 3个部分，他们默认的比例是8:1:1的大小。

栈：栈是线程私有的内存区域，每个方法执行的时候都会在栈创建一个栈帧，方法的调用过程就对应着栈的入栈和出栈的过程。每个栈帧的结构又包含局部变量表、操作数栈、动态连接、方法返回地址。

局部变量表用于存储方法参数和]]></description><category></category></item><item><title><![CDATA[《我要进大厂》- Java基础夺命连环16问]]></title><link>https://blog.youkuaiyun.com/java_kider/article/details/110089752</link><guid>https://blog.youkuaiyun.com/java_kider/article/details/110089752</guid><author>java_kider</author><pubDate>Tue, 24 Nov 2020 18:06:58 +0800</pubDate><description><![CDATA[说说进程和线程的区别？

进程是程序的一次执行，是系统进行资源分配和调度的独立单位，他的作用是是程序能够并发执行提高资源利用率和吞吐率。

由于进程是资源分配和调度的基本单位，因为进程的创建、销毁、切换产生大量的时间和空间的开销，进程的数量不能太多，而线程是比进程更小的能独立运行的基本单位，他是进程的一个实体，可以减少程序并发执行时的时间和空间开销，使得操作系统具有更好的并发性。

线程基本不拥有系统资源，只有一些运行时必不可少的资源，比如程序计数器、寄存器和栈，进程则占有堆、栈。

知道synchroni]]></description><category></category></item></channel></rss>