<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[heng_zou的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/heng_zou</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; heng_zou]]></copyright><item><title><![CDATA[Java面试被问到快速排序的问题]]></title><link>https://blog.csdn.net/heng_zou/article/details/134040557</link><guid>https://blog.csdn.net/heng_zou/article/details/134040557</guid><author>heng_zou</author><pubDate>Wed, 25 Oct 2023 18:28:56 +0800</pubDate><description><![CDATA[【代码】Java面试被问到快速排序的问题。]]></description><category></category></item><item><title><![CDATA[groovy快速上手第2篇：数据类型篇]]></title><link>https://blog.csdn.net/heng_zou/article/details/127456690</link><guid>https://blog.csdn.net/heng_zou/article/details/127456690</guid><author>heng_zou</author><pubDate>Sat, 22 Oct 2022 09:26:40 +0800</pubDate><description><![CDATA[了解一门语言，那么了解她的语法特性必不可少，groovy针对java语言的书写要求做了很多简化。下面直接开始总结groovy的语法特点。]]></description><category></category></item><item><title><![CDATA[groovy快速上手第1篇：简介、环境准备和Java异同点]]></title><link>https://blog.csdn.net/heng_zou/article/details/127454277</link><guid>https://blog.csdn.net/heng_zou/article/details/127454277</guid><author>heng_zou</author><pubDate>Sat, 22 Oct 2022 02:49:42 +0800</pubDate><description><![CDATA[Apache Groovy，看到Apatch就感觉看到了java，Apache围绕java打造了很多开源的web服务应用。所以看到Groovy属于Apache下的时首先想到了Java也不足为奇，事实上Groovy是基于Java平台的，Groovy程序也是运行在JVM之上的。甚至Groovy脚本编译后的字节码和Java的字节码是相通的，你可以通过反编译Groovy字节码来获取Java格式的源码。]]></description><category></category></item><item><title><![CDATA[Netty源码分析6:NioEventLoop]]></title><link>https://blog.csdn.net/heng_zou/article/details/123306325</link><guid>https://blog.csdn.net/heng_zou/article/details/123306325</guid><author>heng_zou</author><pubDate>Mon, 07 Mar 2022 02:16:04 +0800</pubDate><description><![CDATA[NioEventLoop基本介绍
在构建Netty服务时，首先需要创建一个NioEventLoopGroup，即如下代码：
···
NioEventLoopGroup boss = new NioEventLoopGroup(1);
NioEventLoopGroup worker = new NioEventLoopGroup();
···


初始化时机：NioEventLoopGroup内部定义了一个EventExecutor[] children成员变量(NioEventLoop是EventExec]]></description><category></category></item><item><title><![CDATA[Netty源码分析4:NioEventLoopGroup]]></title><link>https://blog.csdn.net/heng_zou/article/details/123288523</link><guid>https://blog.csdn.net/heng_zou/article/details/123288523</guid><author>heng_zou</author><pubDate>Sat, 05 Mar 2022 04:08:34 +0800</pubDate><description><![CDATA[NioEventLoopGroup其父类和实现的接口作用分析


NioEventLoopGroup内部维护了一组NioEventLoop，它们之间的关系有点类似于线程池和线程之间的关系，其类图如下：其中Iterable和ScheduledExecutorService属于jdk提供，



EventExecutorGroup接口作为Netty定义事件执行器组的顶级接口，主要定义了优雅关闭EventExecutorGroup的方法。其次定义了一个next()方法用于轮询内部的EventExecutor。
]]></description><category></category></item><item><title><![CDATA[Netty源码分析3:创建一个简单的Netty服务并测试]]></title><link>https://blog.csdn.net/heng_zou/article/details/123211389</link><guid>https://blog.csdn.net/heng_zou/article/details/123211389</guid><author>heng_zou</author><pubDate>Sat, 05 Mar 2022 01:08:02 +0800</pubDate><description><![CDATA[Netty源码分析3:创建一个简单的Netty服务并测试创建并启动一个Netty服务端创建客户端并连接到客户端服务端boss的ChannelHandler服务端worker和客户端的ChannelHander启动测试启动客户端链接到客户端服务端处理客户端消息
创建并启动一个Netty服务端
如何创建并启动一个Netty服务端？通过如下的代码将启动一个netty服务端并监听在8888端口。
public class MyNettyServer {
    private static Logger logge]]></description><category></category></item><item><title><![CDATA[基于synchronized实现读写锁]]></title><link>https://blog.csdn.net/heng_zou/article/details/123028820</link><guid>https://blog.csdn.net/heng_zou/article/details/123028820</guid><author>heng_zou</author><pubDate>Sun, 20 Feb 2022 12:58:35 +0800</pubDate><description><![CDATA[什么时候可以获取读锁

读锁重入
非写锁独占状态且阻塞队列为空

非写锁独占意味着可能已有线程获取读锁
阻塞队列为空意味着不存在获取不到写锁的线程被阻塞


由于不满足上述两种条件获取读锁将被阻塞(已有新城获取到写锁或被阻塞)，后续被唤醒后将再次尝试获取读锁，如果当前被阻塞的线程所在的节点不存在前继写锁节点线程，则认为可以获取锁

什么情况下可以获取写锁

写锁重入
当前不存在读写锁且阻塞队列为空
阻塞被唤醒后如果不存在任何读写锁且该阻塞节点位于头部时可以获取锁

释放读锁

当且仅当释放最后一把读锁时才会]]></description><category></category></item><item><title><![CDATA[jdk动态代理源码以及缓存结构分析]]></title><link>https://blog.csdn.net/heng_zou/article/details/122286239</link><guid>https://blog.csdn.net/heng_zou/article/details/122286239</guid><author>heng_zou</author><pubDate>Mon, 03 Jan 2022 15:42:29 +0800</pubDate><description><![CDATA[概述
jdk动态代理是基于接口的代理，其在运行期间创建对应接口的代理类字节码class并将字节码class装载进虚拟机实现代理。
简单jdk动态代理例子
我们通过对代理对象创建代理类后，可以在代理对象的被代理方法执行前后增加额外的逻辑，可以修改被代理方法的参数和执行返回结果，甚至可以控制被代理方法是否执行。
public class JdkProxyTest {
    public static void main(String[] args) {
        Itf proxy = (Itf) Pr]]></description><category></category></item><item><title><![CDATA[关于spring中的TypeDescriptor、ResolvableType功能说明]]></title><link>https://blog.csdn.net/heng_zou/article/details/118686086</link><guid>https://blog.csdn.net/heng_zou/article/details/118686086</guid><author>heng_zou</author><pubDate>Tue, 13 Jul 2021 00:28:25 +0800</pubDate><description><![CDATA[TypeDescriptor：类型描述符
该类位于org.springframework.core.convert包下，convert包主要用于类型转换相关功能，在类型转换过程中，通常需要从一个类型转为另一个类型，而Java类型包含基本类型，数组、集合、泛型以及普通类型，该类试图将这些不同的类型使用一种统一的类型来表示，因此方法中提供了各种静态方法和不同的类型来获取一个TypeDescriptor实例，此外也提供了构造器方法来获取TypeDescriptor实例，具体如下：

静态方法获取TypeDescr]]></description><category></category></item><item><title><![CDATA[用户态内核态浅析]]></title><link>https://blog.csdn.net/heng_zou/article/details/118311728</link><guid>https://blog.csdn.net/heng_zou/article/details/118311728</guid><author>heng_zou</author><pubDate>Wed, 30 Jun 2021 21:17:33 +0800</pubDate><description><![CDATA[用户态内核态浅析用户态与内核态定义为什么要区分用户态和内核态如何实现用户态和内核态的切换分析Java synchronized中用出现的用户态内核态切换问题Java IO
用户态与内核态定义
用户态与内核态实际上是cpu运行在两种不同的权限级别上，inter架构将cpu指令按照权限级别由高到低分为4个等级，分别是ring0、ring1、ring2、ring3。而windows实现将所有指令划分为2个级别，即ring0和ring3。ring0级别的cpu指令仅由操作系统程序使用，ring3则是所有程序(包含用]]></description><category></category></item><item><title><![CDATA[Java集合框架]]></title><link>https://blog.csdn.net/heng_zou/article/details/117263587</link><guid>https://blog.csdn.net/heng_zou/article/details/117263587</guid><author>heng_zou</author><pubDate>Sun, 27 Jun 2021 02:00:39 +0800</pubDate><description><![CDATA[Java集合框架详解Collection分析List：有序结合或列表ArrayList：可扩容的数组集合ArrayList特性说明ArrayList源码分析ArrayList中的fast-fail遍历ArrayList的错误示范Vector：线程安全的可扩容数组集合Vector中的线程安全机制Vector中的fast-failStack：基于数组的栈Queue：队列Deque：双端队列LinkedList:链表列表PriorityQueue:优先级队列ArrayDeque:双端数组队列ArrayDeque源]]></description><category></category></item><item><title><![CDATA[CompletionStage及其实现CompletableFuture源码分析]]></title><link>https://blog.csdn.net/heng_zou/article/details/118199501</link><guid>https://blog.csdn.net/heng_zou/article/details/118199501</guid><author>heng_zou</author><pubDate>Sat, 26 Jun 2021 21:59:00 +0800</pubDate><description><![CDATA[概述
CompletionStage直译是完成阶段，如果你发现你有这么一个需求：一个大的任务可以拆分成多个子任务，并且子任务之间有明显的先后顺序或者一个子任务依赖另一个子任务完成的结果时，那么CompletionStage是一个不错的选择，说到底这不就是聚合任务的特色吗？实际上CompletionStage就是实现了将一个大任务分成若个子任务，这些子任务基于一定的并行、串行组合形成任务的不同阶段，CompletionStage接口实现了对这些子任务之间的关系定义，接口方法较多如下：

CompletionS]]></description><category></category></item><item><title><![CDATA[ForkJoinPool的CountedCompleter源码分析]]></title><link>https://blog.csdn.net/heng_zou/article/details/118195472</link><guid>https://blog.csdn.net/heng_zou/article/details/118195472</guid><author>heng_zou</author><pubDate>Fri, 25 Jun 2021 00:41:45 +0800</pubDate><description><![CDATA[CountedCompleter直译是计数的完成器，其使用方式和原理相比RecursiveTask和RecursiveAction相对要复杂，因此案例不多，实际上源码中已经提供了较为详细的说明和使用案例，主要能实现在任务完成时触发一个特定的自定义操作。源码文档比较晦涩，直接分析源码。CountedCompleter新增了两个成员变量：
/**
*当前任务挂起的子任务数，ForkJoinTask的一大特色就是分治任务的拆分，一个大的任务拆分成多个子任务，
*子任务在进行细拆，因此任务和任务之间就形成了层级父子]]></description><category></category></item><item><title><![CDATA[关于ForkJoinPool使用ManagedBlocker防线程阻塞而降低吞吐量的说明]]></title><link>https://blog.csdn.net/heng_zou/article/details/118193846</link><guid>https://blog.csdn.net/heng_zou/article/details/118193846</guid><author>heng_zou</author><pubDate>Thu, 24 Jun 2021 19:45:12 +0800</pubDate><description><![CDATA[ForkJoinPool适合执行计算密集型且可进行拆分任务并汇总结果(类似MapReduce)的任务，执行这种任务可以充分利用多核处理器优势提高任务处理速度，实际上ForkJoinPool内部的工作窃取队列的高性能(远高于普通线程池的BlockingQueue)也决定其适用于执行大量的简短的小任务。
对于IO阻塞型任务，当然可以设置较大的parallelism参数保证并发数防止任务IO阻塞耗时的时候没有空闲工作线程来执行新提交的IO阻塞任务导致CPU空闲，从而线程池的吞吐率不高，参见下方例子，例子中创建30]]></description><category></category></item><item><title><![CDATA[Java平衡二叉树、AVL树的实现，节点增删自平衡]]></title><link>https://blog.csdn.net/heng_zou/article/details/117486848</link><guid>https://blog.csdn.net/heng_zou/article/details/117486848</guid><author>heng_zou</author><pubDate>Thu, 03 Jun 2021 02:01:00 +0800</pubDate><description><![CDATA[Java平衡二叉树、AVL树详解关于树的基本概念关于二叉树的特点AVL树、平衡二叉树添加节点使得树失衡左失衡、右失衡左右失衡、右左失衡失衡节点重平衡代码实现添加节点删除节点
关于树的基本概念

- 树定义：树是n(n&gt;=0)个有限节点的集合，当n=0时称为空树，当n&gt;0时，这些节点满足：每个节点可以有m(m&gt;=0)个子节点；除根节点外每个节点有且只有一个父节点，根节点没有父节点；任意节点的子节点也是一棵树
- 节点：如上图所示的A、B、C···为为一个个节点，节点是树的最小单位，是存储数据]]></description><category></category></item><item><title><![CDATA[jdk1.8新增特性Optional类介绍]]></title><link>https://blog.csdn.net/heng_zou/article/details/117374844</link><guid>https://blog.csdn.net/heng_zou/article/details/117374844</guid><author>heng_zou</author><pubDate>Fri, 28 May 2021 23:33:55 +0800</pubDate><description><![CDATA[Optional的使用场景和其用法介绍Optional的使用场景介绍Optional的方法介绍OptionalDouble、OptionalInt,OptionalLong介绍
jdk1.8新增了一个Optional类，同时还增加了OptionalDouble、OptionalInt,OptionalLong用于对基本类型double、int、long的支持。
Optional的使用场景介绍
有时候我们需要从一个对象中获取其成员变量，甚至需要获取其成员变量的变量，通常为了避免产生空指针异常需要进行非空校验，]]></description><category></category></item><item><title><![CDATA[AQS实现之Semaphore、CountDownLatch、CyclicBarrier分析]]></title><link>https://blog.csdn.net/heng_zou/article/details/117228656</link><guid>https://blog.csdn.net/heng_zou/article/details/117228656</guid><author>heng_zou</author><pubDate>Mon, 24 May 2021 22:31:03 +0800</pubDate><description><![CDATA[对基于AQS的一些线程并发工具的分析SemaphoreCountDownLatchCyclicBarrierCyclicBarrier等待入口方法：await
Semaphore
Semaphore维持一组信号量，信号量的大小代表线程并发上限，超过上限后线程将被阻塞直到其它线程释放信号，该类可用于控制并发大小，详见下面例子，例子中定义了一个持有3个信号两的Semaphore,同时启动12个线程去竞争这个三个信号两，竞争成功后打印提示信息
package com.test.sync;

import lomb]]></description><category></category></item><item><title><![CDATA[Java并发之AQS源码分析ReentranLock、ReentrantReadWriteLock、Condition]]></title><link>https://blog.csdn.net/heng_zou/article/details/117125552</link><guid>https://blog.csdn.net/heng_zou/article/details/117125552</guid><author>heng_zou</author><pubDate>Sat, 22 May 2021 03:03:47 +0800</pubDate><description><![CDATA[基于AQS的重入锁和读写锁的源码分析基本概念说明锁的基本原理思考测试环境实现方案1实现方案2
基本概念说明

AQS:全称AbstractQueuedSynchronizer，是jdk提供的一个并发框架，位于java.util.concurrent包下，该框架已实现独享锁、共享锁的大部分逻辑，开发者只需要少量变成编码即可实现相应的读写锁和共享锁，同时可基于该框架实现公平锁和非公平锁。jdk已经提供了读写锁和共享锁的具体实现，分别是同样位于Java.util.concurrent包下的ReentrantLoc]]></description><category></category></item><item><title><![CDATA[mysql的timestamp类型映射到java类型的TimeStamp类型时报错]]></title><link>https://blog.csdn.net/heng_zou/article/details/78578625</link><guid>https://blog.csdn.net/heng_zou/article/details/78578625</guid><author>heng_zou</author><pubDate>Mon, 20 Nov 2017 01:10:01 +0800</pubDate><description><![CDATA[Cannot convert value ‘2017-04-28 00:00:00.000000’ from column 3 to TIMESTAMP.最近在写jdbc连接mysql查询数据时，偶尔遇到这个问题，具体错误如下：
Exception in thread &quot;main&quot; java.sql.SQLException: Cannot convert value '2017-04-28 00:]]></description><category></category></item><item><title><![CDATA[虚拟机不能ping主机的问题]]></title><link>https://blog.csdn.net/heng_zou/article/details/67074668</link><guid>https://blog.csdn.net/heng_zou/article/details/67074668</guid><author>heng_zou</author><pubDate>Mon, 27 Mar 2017 23:09:20 +0800</pubDate><description><![CDATA[在vartualbox下安装了linux，使用桥接网卡，但在测试二者之间的通信时却出现了奇怪现象，主机可以ping虚拟机，反过来虚拟机就不能ping主机，但是虚拟机可以ping百度，晚上搜了一堆问题都对不上，后面找到一篇博客，原来是主机防火墙的原因，打开ICMPv4-in这个规则即可。
具体操作是打开windows防火墙-高级设置-入栈规则，找到ICMPv4（专用公共），右键启用规则即可。
参考博客]]></description><category></category></item></channel></rss>