<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[madleep的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/madleep</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; madleep]]></copyright><item><title><![CDATA[kafka]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/127723370</link><guid>https://blog.youkuaiyun.com/madleep/article/details/127723370</guid><author>madleep</author><pubDate>Mon, 07 Nov 2022 00:30:52 +0800</pubDate><description><![CDATA[同步的通信⽅式会存在性能和稳定性的问题。]]></description><category></category></item><item><title><![CDATA[hutool(字符串工具-StrUtil与类型转换工具类-Convert)]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/127662001</link><guid>https://blog.youkuaiyun.com/madleep/article/details/127662001</guid><author>madleep</author><pubDate>Thu, 03 Nov 2022 00:22:45 +0800</pubDate><description><![CDATA[不得不提一下这个方法，有人说String有了subString你还写它干啥，我想说subString方法越界啥的都会报异常，你还得自己判断，难受死了，我把各种情况判断都加进来了，而且index的位置还支持负数哦，-1表示最后一个字符（这个思想来自于Python，如果学过Python的应该会很喜欢的），还有就是如果不小心把第一个位置和第二个位置搞反了，也会自动修正（例如想截取第4个和第2个字符之间的部分也是可以的哦~） 举个栗子。因为字符串牵涉到编码问题，因此必须传入编码对象，此处使用UTF-8编码。]]></description><category></category></item><item><title><![CDATA[hutool(Bean工具-BeanUtil)]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/127661930</link><guid>https://blog.youkuaiyun.com/madleep/article/details/127661930</guid><author>madleep</author><pubDate>Thu, 03 Nov 2022 00:12:56 +0800</pubDate><description><![CDATA[把一类中需要进行设置和获得的属性访问权限设置为private（私有的）让外部的使用者看不见摸不着，而通过public（共有的）set和get方法来对其属性的值来进行设置和获得，而内部的操作具体是怎样的？通常Java中对Bean的定义是包含setXXX和getXXX方法的对象，在Hutool中，采取一种简单的判定Bean的方法：是否存在只有一个参数的setXXX方法。Bean之间的转换主要是相同属性的复制，因此方法名为copyProperties，此方法支持Bean和Map之间的字段复制。]]></description><category></category></item><item><title><![CDATA[hutool(枚举工具-EnumUtil与树结构工具-TreeUtil)]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/127661847</link><guid>https://blog.youkuaiyun.com/madleep/article/details/127661847</guid><author>madleep</author><pubDate>Thu, 03 Nov 2022 00:05:33 +0800</pubDate><description><![CDATA[这种树状结构可以根据配置文件灵活的定义节点之间的关系，也能很好的兼容关系数据库中数据。树状结构中最大的问题就是关系问题，在数据库中，每条数据通过某个字段关联自己的父节点，每个业务中这个字段的名字都不同，如何解决这个问题呢？获取枚举字符串值和枚举对象的Map对应，使用LinkedHashMap保证有序，结果中键为枚举名，值为枚举对象。PR的提供者提供了一种解决思路：自定义字段名，节点不再是一个bean，而是一个map，实现灵活的字段名定义。获得枚举名对应指定字段值的Map，键为枚举名，值为字段值。]]></description><category></category></item><item><title><![CDATA[hutool(双向查找Map-BiMap与可重复键值Map-TableMap)]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/127661784</link><guid>https://blog.youkuaiyun.com/madleep/article/details/127661784</guid><author>madleep</author><pubDate>Wed, 02 Nov 2022 23:51:41 +0800</pubDate><description><![CDATA[BiMap要求key和value都不能重复（非强制要求），如果key重复了，后加入的键值对会覆盖之前的键值对，如果value重复了，则会按照不确定的顺序覆盖key，这完全取决于map实现。我们知道在Guava中提供了一种特殊的Map结构，叫做BiMap，它实现了一种双向查找的功能，即根据key查找value和根据value查找key，Hutool也同样提供此对象。因此，Hutool创建了TableMap这类数据结构，通过键值单独建立List方式，使键值对一一对应，实现正向和反向两种查找。]]></description><category></category></item><item><title><![CDATA[hutool(Map工具-MapUtil)]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/127661741</link><guid>https://blog.youkuaiyun.com/madleep/article/details/127661741</guid><author>madleep</author><pubDate>Wed, 02 Nov 2022 23:47:06 +0800</pubDate><description><![CDATA[filter 过滤过程通过传入的Editor实现来返回需要的元素内容，这个Editor实现可以实现以下功能：1、过滤出需要的对象，如果返回null表示这个元素对象抛弃 2、修改元素对象，返回集合中为修改后的对象。join、joinIgnoreNull、sortJoin将Map按照给定的分隔符转换为字符串，此方法一般用于签名。isEmpty、isNotEmpty 判断Map为空和非空方法，空的定义为null或没有值。MapUtil是针对Map的一一列工具方法的封装，包括getXXX的快捷值转换方法。]]></description><category></category></item><item><title><![CDATA[hutool(集合串行流工具-CollStreamUtil)]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/127661694</link><guid>https://blog.youkuaiyun.com/madleep/article/details/127661694</guid><author>madleep</author><pubDate>Wed, 02 Nov 2022 23:40:35 +0800</pubDate><description><![CDATA[合并两个相同key类型的map，可自定义合并的lambda，将key value1 value2合并成最终的类型,注意value可能为空的情况。Java8中的新特性之一就是Stream，Hutool针对常用操作做了一些封装。]]></description><category></category></item><item><title><![CDATA[hutool(列表工具-ListUtil)]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/127661632</link><guid>https://blog.youkuaiyun.com/madleep/article/details/127661632</guid><author>madleep</author><pubDate>Wed, 02 Nov 2022 23:36:38 +0800</pubDate><description><![CDATA[List在集合中中使用最为频繁，因此新版本的Hutool中针对List单独封装了工具方法。其他方法与CollUtil工具类似，很多工具也有重复。]]></description><category></category></item><item><title><![CDATA[hutool(集合工具-CollUtil)]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/127661449</link><guid>https://blog.youkuaiyun.com/madleep/article/details/127661449</guid><author>madleep</author><pubDate>Wed, 02 Nov 2022 23:29:20 +0800</pubDate><description><![CDATA[这个工具主要增加了对数组、集合类的操作。join 方法将集合转换为字符串，这个方法还是挺常用，是StrUtil.split的反方法。这个方法的参数支持各种类型对象的集合，最后连接每个对象时候调用其toString()方法。sortPageAll、sortPageAll2方法这个方法其实是一个真正的组合方法，功能是：将给定的多个集合放到一个列表（List）中，根据给定的Comparator对象排序，然后分页取数据。这个方法非常类似于数据库多表查询后排序分页，这个方法存在的意义也是在此。]]></description><category></category></item><item><title><![CDATA[MYSQL窗口函数的应用]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/121505370</link><guid>https://blog.youkuaiyun.com/madleep/article/details/121505370</guid><author>madleep</author><pubDate>Tue, 23 Nov 2021 23:15:33 +0800</pubDate><description><![CDATA[文章目录一、窗口函数应用于排名

一、窗口函数应用于排名
with student_message(student_name, class_name, score) as (
    select 'sqlservercn', 'MYSQL', 95
    union all
    select 'tom', 'MYSQL', 99
    union all
    select 'mary', 'MYSQL', 98
    union all
    select 'jack', 'MYSQL',]]></description><category></category></item><item><title><![CDATA[MYSQL公共表达式的应用]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/121504216</link><guid>https://blog.youkuaiyun.com/madleep/article/details/121504216</guid><author>madleep</author><pubDate>Tue, 23 Nov 2021 23:12:26 +0800</pubDate><description><![CDATA[文章目录一、mysql公共表达式二、使用实例1.引入2.生成序列3.递归查询回复信息

一、mysql公共表达式
mysql的公共表达式跟select字句一样，不同的是公共表达式需要定义并且可以重复使用，而select字句一般都是现用现写，第二次想用则需要再次去写。公共表达式可以理解为对select字句的定义
二、使用实例
1.引入
代码如下（示例）：
with cte as (select title, class_id
from imc_course where study_cnt &gt; 200)
]]></description><category></category></item><item><title><![CDATA[Thread-per-message]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/120603182</link><guid>https://blog.youkuaiyun.com/madleep/article/details/120603182</guid><author>madleep</author><pubDate>Mon, 04 Oct 2021 13:38:38 +0800</pubDate><description><![CDATA[文章目录前言一、Thread-per-message简介二、程序例子1.Message类2.Message处理类3.客户端4.执行结果总结特点

前言
这一节内容比较简单，也就简单列个例子吧

一、Thread-per-message简介
字面理解就可以了，每个线程处理一个消息。
二、程序例子
1.Message类
代码如下：
package threadpermessage;

public class Message {
    private String value;

    public Mes]]></description><category></category></item><item><title><![CDATA[CountDownLatch]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/120569902</link><guid>https://blog.youkuaiyun.com/madleep/article/details/120569902</guid><author>madleep</author><pubDate>Thu, 30 Sep 2021 17:29:05 +0800</pubDate><description><![CDATA[文章目录前言一、CountDownLatch概述二、代码示例1.共享资源CounDown2.客户端

前言
日常生活中，通常我们完成一件事之后才会接着干下一件事，而一件事可能被分成多个环节由多个人去同步进行，有的人快，有的人慢。但不管怎样，只有全部人都完成了自己负责的环节才算这件事完成了，下一件事才得以继续。这跟java中的CountDownLatch很像，接下来我们就一起探讨下CountDownLatch

一、CountDownLatch概述
示例：一个或者多个线程需要在其它线程都完成任务之后才能执行，]]></description><category></category></item><item><title><![CDATA[Balking Design Pattern]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/120555793</link><guid>https://blog.youkuaiyun.com/madleep/article/details/120555793</guid><author>madleep</author><pubDate>Wed, 29 Sep 2021 20:56:43 +0800</pubDate><description><![CDATA[文章目录前言一、Balking Design Pattern概述二、代码示例1.共享资源2.顾客线程（消费者）3.服务员线程4.客户端5.执行结果

前言
想一下，日常生活中，会有这样一个场景：去海底捞吃饭，海底捞的服务服务员都是服务很周到、很热情的。你的酒杯里没有酒了，他会自动上去服务。可能会有多个服务为你服务，当一个服务员服务完后离开了，这时另一个服务员经过，看到你的酒杯里的酒是满的。这时他就不会再向你服务了。与这个生活场景类似，多线程设计模式里有这么一个模式：Balking Design Patter]]></description><category></category></item><item><title><![CDATA[Future设计模式]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/120537442</link><guid>https://blog.youkuaiyun.com/madleep/article/details/120537442</guid><author>madleep</author><pubDate>Tue, 28 Sep 2021 21:21:36 +0800</pubDate><description><![CDATA[文章目录前言一、什么是未来设计模式？二、代码示例1.Future2.Future实现类3.FutureService4.FutureTask5.客户端6.执行结果

前言
生活中我们为了完成一件事或者达成一个目标，常常需要别人来帮助，比如：我们要定制某个商品，我们需要商家去帮我们定制完成。再比如，我们要去干洗店洗衣间棉袄。正常情况下我们不会傻乎乎的等商家帮我们定制完成商品，或者让干洗店洗完棉袄，我们才去干自己的事情。一般我们都是把事情交给别人后，直接去干自己的事情了，等我们忙完自己的事情之后再去店里取订制品]]></description><category></category></item><item><title><![CDATA[读写锁设计模式]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/120472981</link><guid>https://blog.youkuaiyun.com/madleep/article/details/120472981</guid><author>madleep</author><pubDate>Sat, 25 Sep 2021 17:57:09 +0800</pubDate><description><![CDATA[文章目录前言一、什么是读写锁设计模式二、问题考虑三、读写锁设计四、需求分析1、共享资源2、写工作线程3、读工作线程4、客户端

前言
承接上一节讲单线程执行设计模式中例子的问题：读和写用的是同一个锁。当多个线程同时需要进行读操作的时候，只有一个线程能够读，其它线程被阻塞。导致读操作的串行化，这会使得程序的执行效率降低。为了解决这个问题，我们要将读操作并行化。于是就有了ReadWriteLock Design Pattern（读写锁设计模式）。
一、什么是读写锁设计模式
读写锁设计模式就是将读锁和写锁分离开来]]></description><category></category></item><item><title><![CDATA[单线程执行设计模式]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/120443812</link><guid>https://blog.youkuaiyun.com/madleep/article/details/120443812</guid><author>madleep</author><pubDate>Thu, 23 Sep 2021 22:19:36 +0800</pubDate><description><![CDATA[文章目录前言一、什么是单线程执行设计模式二、简单例子1.大门2.人3.客户端4.执行结果5.结果分析6.问题解决7.解决问题后的执行结果问题延伸

前言
这节我们一起探讨下多线程最简单的设计模式，单线程执行设计设计模式(Single Thread Execution Design Pattern)
一、什么是单线程执行设计模式
在某一时刻只有一个线程在执行，其它线程会进入block状态，这就是单线程执行设计模式。
二、简单例子
这里我们列举一个简单的例子：我们访问一个学校或者一个名人故居的时候都需要登记自己]]></description><category></category></item><item><title><![CDATA[观察者设计模式]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/120358580</link><guid>https://blog.youkuaiyun.com/madleep/article/details/120358580</guid><author>madleep</author><pubDate>Wed, 22 Sep 2021 22:47:12 +0800</pubDate><description><![CDATA[文章目录前言一、什么是观察者设计模式？二、应用场景二、简单代码示例2.读入数据总结

前言
从本节内容开始我们要正式进入并发编程设计模式的学习了，首先讲的是观察者设计模式，我们先从java的设计模式开始，然后再过度到并发编程的观察者模式

一、什么是观察者设计模式？
关于什么是观察者模式？我的理解是这样的。首先观察者模式有观察者这么个角色，既然有观察者，那么就有被观察者。然后这个模式强调的是观察者两个字。也就是观察者实时观察这被观察者的一举一动。一旦被观察者的状态发生改变，那么所有的观察者就会做出相应的动作]]></description><category></category></item><item><title><![CDATA[volatile关键字二]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/120340179</link><guid>https://blog.youkuaiyun.com/madleep/article/details/120340179</guid><author>madleep</author><pubDate>Fri, 17 Sep 2021 00:42:04 +0800</pubDate><description><![CDATA[文章目录前言一、volatile关键字的作用以及缺陷二、例子代码示例1三、volatile关键字的使用场景总结

前言
前两节内容我们讲了cpu内存模型、java内存模型、以及并发编程的三个重要概念。同时也举了个例子引入了volatile大概的作用。那接下里这一讲我们就可以很好的理解volatile的作用了，也就相当于对volatile关键字做最后的总结

一、volatile关键字的作用以及缺陷
1、保证线程间的可见性
怎么保证可见性，相信大家都已经理解了。线程之间，如果有线程对共享变量进行了修改，那么其]]></description><category></category></item><item><title><![CDATA[并发编程的三个重要概念]]></title><link>https://blog.youkuaiyun.com/madleep/article/details/120317993</link><guid>https://blog.youkuaiyun.com/madleep/article/details/120317993</guid><author>madleep</author><pubDate>Wed, 15 Sep 2021 23:35:07 +0800</pubDate><description><![CDATA[文章目录前言一、并发编程的三个重要概念是什么？二、概念引入1.cpu的缓存解析2.cpu如何解决缓存不一致问题二、并发编程的三个概念1.原子性1.可见性3.有序性四、如何保证原子性、可见性、有序性。1.原子性2.可见性3.有序性

前言
想要学好并发编程，那么久要完全掌握并发编程的相关概念，接下来我们将一起探讨并发编程中的三个重要概念

提示：以下是本篇文章正文内容，下面案例可供参考
一、并发编程的三个重要概念是什么？
1、原子性
2、可见性
3、有序性
二、概念引入
1.cpu的缓存解析
为了更好的理解并]]></description><category></category></item></channel></rss>