<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ProMonkey_chen的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ProMonkey_chen</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ProMonkey_chen]]></copyright><item><title><![CDATA[解决Error response from daemon: conflict: unable to delete 7597f617968f (must be forced) - image is be]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/120691854</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/120691854</guid><author>ProMonkey_chen</author><pubDate>Sun, 10 Oct 2021 20:48:33 +0800</pubDate><description><![CDATA[在删除REPOSITORY为none的docker镜像时，报如下Error错误：


[root@VM-0-16-centos ~]# docker images | grep none | awk '{print $3}' | xargs docker rmi
Error response from daemon: conflict: unable to delete 7597f617968f (must be forced) - image is being used by stopped contai]]></description><category></category></item><item><title><![CDATA[postgresql的CopyManager流式数据入库]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/120627641</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/120627641</guid><author>ProMonkey_chen</author><pubDate>Wed, 06 Oct 2021 18:25:16 +0800</pubDate><description><![CDATA[maven依赖如下：


        &lt;dependency&gt;
            &lt;groupId&gt;org.postgresql&lt;/groupId&gt;
            &lt;artifactId&gt;postgresql&lt;/artifactId&gt;
            &lt;version&gt;42.2.5&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependen]]></description><category></category></item><item><title><![CDATA[ForkJoinPool]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/119606830</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/119606830</guid><author>ProMonkey_chen</author><pubDate>Wed, 11 Aug 2021 15:39:13 +0800</pubDate><description><![CDATA[ForkJoinPool是ExecutorService的实现类，也是一种特殊的线程池。它提供了如下两个常用的构造器：

ForkJoinPool(int parallelism)：创建一个包含parallelism个并行线程的ForkJoinPool。
	ForkJoinPool()：以Runtime.availableProcessors()方法的返回值作为parallelism参数来创建ForkJoinPool。
在java8进一步丰富了ForkJoinPool的功能，为其增加了通用池功能。通过如下两]]></description><category></category></item><item><title><![CDATA[WatchService监控文件变化]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/119538513</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/119538513</guid><author>ProMonkey_chen</author><pubDate>Mon, 09 Aug 2021 15:14:47 +0800</pubDate><description><![CDATA[在NIO.2中的Path类提供了如下一个方法来监听文件系统的变化。


register(WatchService watcher,WatchEvent.Kind&lt;?&gt;... events):用watcher监听path代表的目录下的文件变化。events参数指定要监听的类型事件。

注册完成之后，接下来就可以调用WatchService的下面三个方法来获取被监听目录的文件变化事件：

WatchKey poll(): 获取下一个WatchKey，如果没有WatchKey变化就立即返回null。]]></description><category></category></item><item><title><![CDATA[FileVisitor遍历文件和目录]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/119537436</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/119537436</guid><author>ProMonkey_chen</author><pubDate>Mon, 09 Aug 2021 14:47:12 +0800</pubDate><description><![CDATA[主要是用Files的walkFileTree方法进行遍历，先看方法：


	
walkFileTree(Path start, FileVisitor&lt;? super Path&gt; visitor)：遍历start路径下的所有文件和子目录。


	
	
	
walkFileTree(Path start,Set&lt;FileVisitOption&gt; options,int maxDepth,FileVisitor&lt;? super Path&gt; visitor)：与上一个方法功能类]]></description><category></category></item><item><title><![CDATA[Docker常用命令]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/115840516</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/115840516</guid><author>ProMonkey_chen</author><pubDate>Sun, 18 Apr 2021 22:08:34 +0800</pubDate><description><![CDATA[总的来说分为以下几种：


  docker [run|start|stop|restart|kill|rm|pause|unpause]             #容器生命周期管理
  docker [ps|inspect|top|attach|events|logs|wait|export|port]       #容器操作运维
  docker [commit|cp|diff]                                           #容器rootfs命令
  doc...]]></description><category></category></item><item><title><![CDATA[java中lombok里的Builder注解]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103597024</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103597024</guid><author>ProMonkey_chen</author><pubDate>Wed, 18 Dec 2019 14:31:58 +0800</pubDate><description><![CDATA[Lombok大家都知道，在使用POJO过程中，对于java对象的创建工作它可以更优雅，不需要写多余的重复的代码它给我们带来了很多便利，例如省下大量写get、set方法、构造器、equal、toString方法的时间。除此之外，通过@Builder注解，lombok还可以方便的时间建造者模式。

   @Builder提供在设计数据实体时，对外保持private setter，...]]></description><category></category></item><item><title><![CDATA[ReentrantLock 可重入锁]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103557957</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103557957</guid><author>ProMonkey_chen</author><pubDate>Mon, 16 Dec 2019 10:21:13 +0800</pubDate><description><![CDATA[可重入性是指线程在持有锁的情况下再次请求加锁，如果一个锁支持同一个线程的多次加锁，那么这个锁就是可重入的。比如 Java 语言里有个 ReentrantLock 就是可重入锁。如果Redis 分布式锁要支持可重入，需要对客户端的 set 方法进行包装，使用线程的 Threadlocal 变量存储当前持有锁的计数。

代码如下：


public class RedisWithRee...]]></description><category></category></item><item><title><![CDATA[设计模式之工厂模式]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103529015</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103529015</guid><author>ProMonkey_chen</author><pubDate>Fri, 13 Dec 2019 16:55:22 +0800</pubDate><description><![CDATA[一、定义

工厂方法（FactoryMethod）模式的定义：定义一个创建产品对象的工厂接口，将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

应用实例：1、您需要一辆汽车，可以直接从工厂里面提货，而不用去管这辆汽车是怎么做出来的，以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。

二、优缺点

优点：...]]></description><category></category></item><item><title><![CDATA[双重检查锁为什么要使用volatile字段]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103521141</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103521141</guid><author>ProMonkey_chen</author><pubDate>Fri, 13 Dec 2019 11:16:37 +0800</pubDate><description><![CDATA[双重检查锁的由来

在单例模式中，有一个DCL（双重锁）的实现方式，在Java程序中，很多时候需要推迟一些高开销的对象初始化操作，并且只有在使用这些对象的时候才进行开始初始化。

先来看下面实现单例的方式：

非线性安全的延迟初始化对象方式：


public class Test1 {
    private static SingletonInstance instance;
    priv...]]></description><category></category></item><item><title><![CDATA[设计模式之装饰者模式]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103464074</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103464074</guid><author>ProMonkey_chen</author><pubDate>Mon, 09 Dec 2019 20:33:18 +0800</pubDate><description><![CDATA[一、定义

装饰（Decorator）模式的定义：指在不改变现有对象结构的情况下，动态地给该对象增加一些职责（即增加其额外功能）的模式，它属于对象结构型模式。

二、优缺点

优点：

采用装饰模式扩展对象的功能比采用继承方式更加灵活。
	可以设计出多个不同的具体装饰类，创造出多个不同行为的组合。
缺点：

装饰模式增加了许多子类，如果过度使用会使程序变得很复杂。
三、代码实现举例

（1）创建一...]]></description><category></category></item><item><title><![CDATA[简单了解 RPC 实现原理]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102330228</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102330228</guid><author>ProMonkey_chen</author><pubDate>Sun, 08 Dec 2019 16:49:46 +0800</pubDate><description><![CDATA[之前一直在用rpc框架，内部原理今天学习了一下，原作者梁飞，在此记录下他非常简洁的rpc实现思路，通过该思路了解一下原理。

    一个完整的RPC架构里面包含了四个核心的组件，分别是Client，Client Stub，Server以及Server Stub，这个Stub可以理解为存根。

客户端(Client)，服务的调用方。
	客户端存根(Client Stub)，存放服务端的地址...]]></description><category></category></item><item><title><![CDATA[设计模式之观察者模式]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103420212</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103420212</guid><author>ProMonkey_chen</author><pubDate>Fri, 06 Dec 2019 13:56:01 +0800</pubDate><description><![CDATA[一、定义

观察者（Observer）模式—指多个对象间存在一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。

该种模式有时又称作发布-订阅模式、模型-视图模式，它是对象行为型模式。

应用实例：1、拍卖的时候，拍卖师观察最高标价，然后通知给其他竞价者竞价。 2、投标项目，甲方发布招标通知，乙方去获取该消息。

二、优缺点

该模式是一种对象行为型模式，其...]]></description><category></category></item><item><title><![CDATA[设计模式之策略模式]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103387107</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/103387107</guid><author>ProMonkey_chen</author><pubDate>Wed, 04 Dec 2019 15:42:47 +0800</pubDate><description><![CDATA[一、定义

策略模式—定义算法族，分别封装起来，让它们之间可以相互替换，此模式让算法的变化独立于使用算法的客户。

该模式属于对象行为模式，它通过对算法进行封装，把使用算法的责任和算法的实现分割开来，并委派给不同的对象对这些算法进行管理。

应用举例：① 诸葛亮的锦囊妙计，每一个锦囊就是一个策略。 ② 旅行的出游方式，选择骑自行车、坐汽车，每一种旅行方式都是一个策略。

二、使用场景以及优缺点
...]]></description><category></category></item><item><title><![CDATA[Drools简单入门]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102573078</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102573078</guid><author>ProMonkey_chen</author><pubDate>Tue, 15 Oct 2019 19:38:08 +0800</pubDate><description><![CDATA[因为在项目要用到Drools，所以下面写了一个简单的例子学习入门。

一、Drools简介：

JBoss Rules 的前身是Codehaus的一个开源项目叫Drools。最近被纳入JBoss门下，更名为JBoss Rules，成为了JBoss应用服务器的规则引擎。

Drools是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE...]]></description><category></category></item><item><title><![CDATA[缓存和 DB 的数据一致性问题]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102484342</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102484342</guid><author>ProMonkey_chen</author><pubDate>Fri, 11 Oct 2019 10:45:16 +0800</pubDate><description><![CDATA[缓存和DB的数据不一致主要有两种情况：

并发的场景下，导致读取旧的 DB 数据，更新到缓存中。
	缓存和 DB 的操作，不在一个事务中，可能只有一个操作成功，而另一个操作失败，导致不一致。
常用的优化方案，主要是解决两个问题：

将缓存可能存在的并行写，实现串行写。
	实现数据的最终一致性。
下面是我们比较常用到的集中优化手段：

1、先淘汰缓存，再写数据库，注意要引入分布式锁，从而实现串行写的...]]></description><category></category></item><item><title><![CDATA[缓存穿透、缓存击穿、缓存雪崩区别]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102482531</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102482531</guid><author>ProMonkey_chen</author><pubDate>Thu, 10 Oct 2019 14:53:09 +0800</pubDate><description><![CDATA[一、缓存穿透

缓存穿透是指缓存和数据库中都没有的数据，而用户不断发起请求。（查询一个一定不存在的数据。如资源表，查询一个不存在的id，每次都会访问DB，如果有人恶意破坏，很可能直接对DB造成影响。）

解决方案：

   接口层增加校验，如用户鉴权校验，id做基础校验。

   从缓存取不到的数据，在数据库中也没有取到，这时也可以将key-value对写为...]]></description><category></category></item><item><title><![CDATA[dubbo四种负载均衡策略]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102471137</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/102471137</guid><author>ProMonkey_chen</author><pubDate>Wed, 09 Oct 2019 22:23:09 +0800</pubDate><description><![CDATA[客户端调用服务端时，如何选择调用服务端的哪台机器上的服务呢。这就设计到负载均衡策略了，dubbo给出了如下四种策略：




随机模式。按权重设置随机概率。在一个截面上碰撞的概率较高，但调用越大分布越均匀
	轮询模式。按公约后的权重设置轮询比例。但存在响应慢的服务提供者会累积请求
	最少活跃调用数。响应快的提供者接受越多请求，响应慢的接受越少请求
	一致hash。根据服务提供者ip设置hash环，...]]></description><category></category></item><item><title><![CDATA[Mysql日志相关]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/101998997</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/101998997</guid><author>ProMonkey_chen</author><pubDate>Thu, 03 Oct 2019 16:25:22 +0800</pubDate><description><![CDATA[1、查询日志

    在 MySQL 中也称为通用日志（general log），查询日志里面记录了数据库执行的所有命令，不管语句是否正确，都会被记录，原因如下:

insert 查询为了避免数据冲突，如果此前插入过数据，当前插入的数据如果跟主键或唯一键的数据重复那肯定会报错；
	update 时也会查询因为更新的时候很可能会更新某一块数据；
	delete 查询，只删除符合条件的数据；...]]></description><category></category></item><item><title><![CDATA[Spring事物管理]]></title><link>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/99239094</link><guid>https://blog.youkuaiyun.com/ProMonkey_chen/article/details/99239094</guid><author>ProMonkey_chen</author><pubDate>Sat, 28 Sep 2019 20:28:42 +0800</pubDate><description><![CDATA[一、初步理解事物

    先来一波国际惯例，关于事物，大家比较熟知就是取钱。比如你去ATM机取2000块钱，是有两个步骤：首先输入密码金额，银行卡扣掉2000元钱；然后ATM出2000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了2000块，但是ATM出钱失败的话，你将会损失2000元；如果银行卡扣钱失败但是ATM却出了2000块，那么银行将损失2000元。所以，通过上面...]]></description><category></category></item></channel></rss>