<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[不忘初心，好好沉淀]]></title><description><![CDATA[后端工程师，前端技术爱好者]]></description><link>https://blog.csdn.net/dm_vincent</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; dm_vincent]]></copyright><item><title><![CDATA[[Golang]实现一个带有等待和超时功能的协程池 - 类似Java中的ExecutorService接口实现]]></title><link>https://blog.csdn.net/dm_vincent/article/details/105326237</link><guid>https://blog.csdn.net/dm_vincent/article/details/105326237</guid><author>dm_vincent</author><pubDate>Sun, 05 Apr 2020 14:02:19 +0800</pubDate><description><![CDATA[对于支持CSP并发编程模型的Golang而言，要实现一个协程池是非常简单的。对于习惯了基于线程模型完成并发编程的开发同学，可能初次接触会有点难理解，但是俗话说"书读百遍其义自见"，百来行的代码也并不多。
我们的目标是实现一个具有以下特性的协程池(熟悉Java的话，基本上就是实现了ExecutorService接口中的主要方法)：

能够指定任务队列长度和工作协程的数量使用任务队列
能够支持启动和停...]]></description><category></category></item><item><title><![CDATA[[Java 并发基础] 也来聊聊Java多线程中的一些概念问题]]></title><link>https://blog.csdn.net/dm_vincent/article/details/95789263</link><guid>https://blog.csdn.net/dm_vincent/article/details/95789263</guid><author>dm_vincent</author><pubDate>Sat, 13 Jul 2019 20:43:12 +0800</pubDate><description><![CDATA[文章导航什么是多线程并发为什么要进行多线程并发编程线程安全Java内存模型映射到现代硬件架构内存可见性问题的解决方案synchronizedvolatile原子性和线程安全，锁和内存可见性
什么是多线程并发
理清并发和并行的概念。
并发：同一个时间段内多个任务同时都在执行，并且都没有执行结束。
并行：在单位时间内多个任务同时在执行。
并发任务强调在一个时间段内同时执行，而一个时间段是由多个单位时间...]]></description><category></category></item><item><title><![CDATA[JDK 8 函数式编程最佳实践]]></title><link>https://blog.csdn.net/dm_vincent/article/details/95661178</link><guid>https://blog.csdn.net/dm_vincent/article/details/95661178</guid><author>dm_vincent</author><pubDate>Fri, 12 Jul 2019 21:05:12 +0800</pubDate><description><![CDATA[文章导航JDK 8 函数式编程最佳实践1. Lambda表达式的重要接口1.1 新增的函数接口1.1 无参数，无返回值类型接口1.2 无参数，有返回值类型接口1.3 有参数，也有返回值的类型接口2. 方法引用2.1 静态方法引用2.2 实例方法引用2.3 构造方法引用3. 使用Lambda表达式完成集合的规约操作3.1 成为一个单值类型3.2 成为一个集合类型3.3 stream和parallel...]]></description><category></category></item><item><title><![CDATA[[分布式事务-TCC] 6. TCC的优化方案之三：二阶段异步化]]></title><link>https://blog.csdn.net/dm_vincent/article/details/95038027</link><guid>https://blog.csdn.net/dm_vincent/article/details/95038027</guid><author>dm_vincent</author><pubDate>Sun, 07 Jul 2019 22:21:48 +0800</pubDate><description><![CDATA[二阶段异步化
采用TCC模型实现分布式事务之后，分布式事务所需的资源也是按照业务的维护进行切分，每笔分布式事务之间的资源都是独立预留和消费。
单说这些可能有点难理解举个栗子就很容易理解了，账户A同时参与了两笔分布式事务，一笔是转账50元到账户B；另一笔是转账100元到账户C。
那么每笔分布式事务都会各自预留所需的资源，它们感知不到彼此的存在，也不会互相干扰。这里顺便复习一下实现TCC模型的一个关键...]]></description><category></category></item><item><title><![CDATA[[分布式事务-TCC] 5. TCC的优化方案之二：同库优化]]></title><link>https://blog.csdn.net/dm_vincent/article/details/95036869</link><guid>https://blog.csdn.net/dm_vincent/article/details/95036869</guid><author>dm_vincent</author><pubDate>Sun, 07 Jul 2019 22:10:08 +0800</pubDate><description><![CDATA[同库优化
在上一篇文章中，介绍了最末参与者优化(LPO)，它能够减少网络调用的开销。减少网络调用不仅是降低了RT，更重要的是将系统执行的时序复杂度降低了。在对数据一致性有一定要求的高并发场景下，还是能够起到很大的作用。
进行最末参与者优化后的时序如下：

以减少网络调用次数和每次调用的耗时为切入点，我们来思考一下看看还有没有优化的空间。
注意到发起方需要和TC的几次交互如下：

分布式事务开始时，...]]></description><category></category></item><item><title><![CDATA[[分布式事务-TCC] 4. TCC的优化方案之一：最末参与者优化(LPO)]]></title><link>https://blog.csdn.net/dm_vincent/article/details/94413095</link><guid>https://blog.csdn.net/dm_vincent/article/details/94413095</guid><author>dm_vincent</author><pubDate>Mon, 01 Jul 2019 23:14:34 +0800</pubDate><description><![CDATA[文章导航优化动机和指导原则最末参与者优化(LPO)
优化动机和指导原则
当一笔分布式事务的参与者较多时，同时每个参与者都涉及到一阶段和二阶段，还有异常场景下的幂等控制，空回滚以及防资源悬挂处理，调用关系会显著复杂化。特别当业务并发量很大的情况下。比如国内领先的第三方支付场景，并发量在高峰期十分惊人。
那么如何尽可能地提高分布式事务的性能就是一个值得深入思考的问题。
其实优化的原则也很直观：在能够满...]]></description><category></category></item><item><title><![CDATA[[分布式事务-TCC] 3. TCC两个阶段的流程图]]></title><link>https://blog.csdn.net/dm_vincent/article/details/93780909</link><guid>https://blog.csdn.net/dm_vincent/article/details/93780909</guid><author>dm_vincent</author><pubDate>Wed, 26 Jun 2019 21:21:46 +0800</pubDate><description><![CDATA[TCC两个阶段总结
TCC作为分布式事务的一种具有强实时性保证的解决方案，其主要思想在于资源预留。在一切顺利的情况下，一阶段TRY还是很容易理解的。只不过为了保证在各种异常场景下，TCC都能够正常的工作，会添加不少异常处理手段。
为了把两个阶段的行为梳理清楚，绘制了下面的流程图作为总结。
涉及到的具体细节，可以结合前面的讨论进行回顾。
一阶段 - TRY

二阶段 - CONFIRM/CANCEL...]]></description><category></category></item><item><title><![CDATA[[分布式事务-TCC] 2. TCC的异常场景及应对机制]]></title><link>https://blog.csdn.net/dm_vincent/article/details/92432059</link><guid>https://blog.csdn.net/dm_vincent/article/details/92432059</guid><author>dm_vincent</author><pubDate>Sun, 16 Jun 2019 21:40:33 +0800</pubDate><description><![CDATA[文章导航TCC的异常场景幂等处理产生原因应对策略空回滚产生原因应对策略资源悬挂产生原因应对策略三种异常总结幂等空回滚资源悬挂共通点
TCC的异常场景
在分布式系统中，随时随地都需要面对网络超时，网络重发和服务器宕机等问题。所以分布式事务框架作为搭载在分布式系统之上的一个框架型应用也绕不开这些问题。具体而言，有以下常见问题：

幂等处理
空回滚
资源悬挂

这些异常的应对需要TCC框架的支持和解决方...]]></description><category></category></item><item><title><![CDATA[[分布式事务-TCC] 1. 分布式事务的由来和TCC的核心思想和工作流程]]></title><link>https://blog.csdn.net/dm_vincent/article/details/92199474</link><guid>https://blog.csdn.net/dm_vincent/article/details/92199474</guid><author>dm_vincent</author><pubDate>Sat, 15 Jun 2019 21:33:28 +0800</pubDate><description><![CDATA[文章导航分布式事务的由来和TCC的核心思想和工作流程写在前面引子TCC是什么TCC的核心思想TCC关联概念TCC调用一个例子：转账场景下的TCC实现
分布式事务的由来和TCC的核心思想和工作流程
写在前面
分布式事务是一个大的命题，有很多相关的技术和细节。网上介绍这个主题的文章也是多如牛毛，但是能把问题的来龙去脉给讲清楚的文章并不多。
我也不敢说自己就一定能够把这个本来就很复杂的事情讲的有多通透。...]]></description><category></category></item><item><title><![CDATA[CLH锁的原理和实现]]></title><link>https://blog.csdn.net/dm_vincent/article/details/79842501</link><guid>https://blog.csdn.net/dm_vincent/article/details/79842501</guid><author>dm_vincent</author><pubDate>Sat, 07 Apr 2018 16:12:17 +0800</pubDate><description><![CDATA[前情回顾

上一篇文章中主要讨论了MCS自旋锁的特点和其适用场景，并分析了其原理和实现细节。



MCS锁存在的问题

MCS锁解决了简单自旋锁的一个最大痛点：频繁地缓存同步操作会导致繁重的系统总线和内存的流量，从而大大降低了系统整体的性能。

解决这个问题的思路是将自旋操作限制在一个本地变量上，从而在根本上避免了频繁地多CPU之间的缓存同步。但是MCS锁的实现并不简单，需要注意的事项主要有以下...]]></description><category></category></item><item><title><![CDATA[MCS锁的原理和实现]]></title><link>https://blog.csdn.net/dm_vincent/article/details/79783104</link><guid>https://blog.csdn.net/dm_vincent/article/details/79783104</guid><author>dm_vincent</author><pubDate>Sun, 01 Apr 2018 22:51:47 +0800</pubDate><description><![CDATA[前情回顾

上一篇文章中主要讨论了自旋锁的特点和其适用场景，然后给出了两种自旋锁的简单实现。



存在的问题

无论是简单的非公平自旋锁还是公平的基于排队的自旋锁，由于执行线程均在同一个共享变量上自旋，申请和释放锁的时候必须对该共享变量进行修改，这将导致所有参与排队自旋锁操作的处理器的缓存变得无效。如果排队自旋锁竞争比较激烈的话，频繁的缓存同步操作会导致繁重的系统总线和内存的流量，从而大大降低了...]]></description><category></category></item><item><title><![CDATA[简单的非公平自旋锁以及基于排队的公平自旋锁的实现]]></title><link>https://blog.csdn.net/dm_vincent/article/details/79677891</link><guid>https://blog.csdn.net/dm_vincent/article/details/79677891</guid><author>dm_vincent</author><pubDate>Sat, 24 Mar 2018 14:47:52 +0800</pubDate><description><![CDATA[基础



什么是自旋锁

由于本文主要讨论的都是自旋锁，所以首先就需要弄明白什么是自旋锁。

自旋锁最大的特征，就是它会一直循环检测锁的状态，当锁处于被占用的状态时，不会将当前线程阻塞住，而是任由它继续消耗CPU Cycles，直到发现需要的锁处于可用状态。

有了这一层了解，自旋锁的优势和劣势，以及其适用场景也就一目了然了。



优势：


没有线程阻塞，也就没有了线程上下文切换带来的开销
...]]></description><category></category></item><item><title><![CDATA[为什么volatile++不是原子性的？]]></title><link>https://blog.csdn.net/dm_vincent/article/details/79604716</link><guid>https://blog.csdn.net/dm_vincent/article/details/79604716</guid><author>dm_vincent</author><pubDate>Sun, 18 Mar 2018 21:23:19 +0800</pubDate><description><![CDATA[问题

在讨论原子性操作时，我们经常会听到一个说法：任意单个volatile变量的读写具有原子性，但是volatile++这种操作除外。

所以问题就是：为什么volatile++不是原子性的？



答案

因为它实际上是三个操作组成的一个符合操作。


首先获取volatile变量的值
将该变量的值加1
将该volatile变量的值写会到对应的主存地址


一个很简单的例子：

如果两个线程在...]]></description><category></category></item><item><title><![CDATA[[Spring Boot] 5. Spring Boot中的ApplicationContext -   执行ApplicationContextInitializer初始化器]]></title><link>https://blog.csdn.net/dm_vincent/article/details/77619780</link><guid>https://blog.csdn.net/dm_vincent/article/details/77619780</guid><author>dm_vincent</author><pubDate>Sun, 27 Aug 2017 12:50:17 +0800</pubDate><description><![CDATA[前面已经对Spring Boot启动过程进行过源码分析，对于代表容器上下文的关键字段ApplicationContext只是一笔带过。实际上，它的生命周期才应该是重点关注的。Spring Boot使用的ApplicationContext分两种场景，常规应用和Web应用使用的上下文类型不一样：
常规应用：org.springframework.context.annotation.Annotatio]]></description><category></category></item><item><title><![CDATA[[Spring Boot] 4. Spring Boot实现自动配置的原理]]></title><link>https://blog.csdn.net/dm_vincent/article/details/77619752</link><guid>https://blog.csdn.net/dm_vincent/article/details/77619752</guid><author>dm_vincent</author><pubDate>Sun, 27 Aug 2017 12:44:17 +0800</pubDate><description><![CDATA[入口注解类@EnableAutoConfiguration@SpringBootApplication注解中包含了自动配置的入口注解：@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration]]></description><category></category></item><item><title><![CDATA[[Spring Boot] 3. Spring Boot实现自动配置的基础]]></title><link>https://blog.csdn.net/dm_vincent/article/details/77435515</link><guid>https://blog.csdn.net/dm_vincent/article/details/77435515</guid><author>dm_vincent</author><pubDate>Sun, 20 Aug 2017 23:00:20 +0800</pubDate><description><![CDATA[在第一篇文章介绍Spring Boot启动过程，提到了Spring Boot的核心能力 - 自动配置。这个能力也是Spring Boot非常大的卖点之一。对这个能力，相信很多同学都会比较好奇，Spring Boot是如何实现它的呢？但是在详细探究Spring Boot是如何实现自动配置之前，首先需要明确问题的来源是什么，以及了解目前Spring框架中提供的相关能力。引子问题是什么Spring中纷繁复]]></description><category></category></item><item><title><![CDATA[[Spring Boot] 2. Spring Boot 启动过程定制化]]></title><link>https://blog.csdn.net/dm_vincent/article/details/77151122</link><guid>https://blog.csdn.net/dm_vincent/article/details/77151122</guid><author>dm_vincent</author><pubDate>Sun, 13 Aug 2017 22:45:21 +0800</pubDate><description><![CDATA[在上一篇文章中，从源码角度介绍了Spring Boot的启动过程。启动的代码虽然只有短短的一行，但是背后所做的工作还真不少，其中有一些可以定制化的部分，主要分为以下几个方面：
初始化器(Initializer)
监听器(Listener)
容器刷新后置Runners(ApplicationRunner或者CommandLineRunner接口的实现类)
启动期间在Console打印Banner的具体]]></description><category></category></item><item><title><![CDATA[[Spring Boot] 1. Spring Boot启动过程源码分析]]></title><link>https://blog.csdn.net/dm_vincent/article/details/76735888</link><guid>https://blog.csdn.net/dm_vincent/article/details/76735888</guid><author>dm_vincent</author><pubDate>Sat, 05 Aug 2017 21:25:54 +0800</pubDate><description><![CDATA[关于Spring Boot，已经有很多介绍其如何使用的文章了，本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的，为何以往纷繁复杂的配置到如今可以这么简便。1. 入口类package com.example.demo;import org.springframework.boot.SpringApplication;
import org]]></description><category></category></item><item><title><![CDATA[[AOP] 7. 一些自定义的Aspect - Circuit Breaker]]></title><link>https://blog.csdn.net/dm_vincent/article/details/76379045</link><guid>https://blog.csdn.net/dm_vincent/article/details/76379045</guid><author>dm_vincent</author><pubDate>Sun, 30 Jul 2017 13:40:12 +0800</pubDate><description><![CDATA[Circuit Breaker(断路器)模式关于断路器模式是在微服务架构/远程调用环境下经常被使用到的一个模式。它的作用一言以蔽之就是提高系统的可用性，在出现的问题通过服务降级的手段来保证系统的整体可用，而不至于因为部分问题导致整个系统不可用。用下面这张图可以很好的说明它能够解决的问题： 
图片引用自参考资料1。其中从client和supplier可以分别理解成调用者和远程方法。在没有Circuit]]></description><category></category></item><item><title><![CDATA[[AOP] 6. 一些自定义的Aspect - 方法的重试(Retry)]]></title><link>https://blog.csdn.net/dm_vincent/article/details/72851240</link><guid>https://blog.csdn.net/dm_vincent/article/details/72851240</guid><author>dm_vincent</author><pubDate>Sat, 03 Jun 2017 12:01:10 +0800</pubDate><description><![CDATA[前面的一系列文章介绍了AOP的方方面面：
AOP的由来以及快速上手
AOP的两种实现-Spring AOP以及AspectJ
Spring AOP中提供的种种Aspects - Tracing相关
Spring AOP中提供的种种Aspects - 异步执行
Spring AOP中提供的种种Aspects - 并发控制
从本篇文章开始，会介绍一些基于AOP原理的自定义Aspect实现，用来解决在开发]]></description><category></category></item></channel></rss>