自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不忘初心,好好沉淀

后端工程师,前端技术爱好者

  • 博客(203)
  • 收藏
  • 关注

原创 [Golang]实现一个带有等待和超时功能的协程池 - 类似Java中的ExecutorService接口实现

对于支持CSP并发编程模型的Golang而言,要实现一个协程池是非常简单的。对于习惯了基于线程模型完成并发编程的开发同学,可能初次接触会有点难理解,但是俗话说"书读百遍其义自见",百来行的代码也并不多。我们的目标是实现一个具有以下特性的协程池(熟悉Java的话,基本上就是实现了ExecutorService接口中的主要方法):能够指定任务队列长度和工作协程的数量使用任务队列能够支持启动和停...

2020-04-05 14:02:19 1356

原创 [Java 并发基础] 也来聊聊Java多线程中的一些概念问题

文章导航什么是多线程并发为什么要进行多线程并发编程线程安全Java内存模型映射到现代硬件架构内存可见性问题的解决方案synchronizedvolatile原子性和线程安全,锁和内存可见性什么是多线程并发理清并发和并行的概念。并发:同一个时间段内多个任务同时都在执行,并且都没有执行结束。并行:在单位时间内多个任务同时在执行。并发任务强调在一个时间段内同时执行,而一个时间段是由多个单位时间...

2019-07-13 20:43:12 640

原创 JDK 8 函数式编程最佳实践

文章导航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...

2019-07-12 21:05:12 1635

原创 [分布式事务-TCC] 6. TCC的优化方案之三:二阶段异步化

二阶段异步化采用TCC模型实现分布式事务之后,分布式事务所需的资源也是按照业务的维护进行切分,每笔分布式事务之间的资源都是独立预留和消费。单说这些可能有点难理解举个栗子就很容易理解了,账户A同时参与了两笔分布式事务,一笔是转账50元到账户B;另一笔是转账100元到账户C。那么每笔分布式事务都会各自预留所需的资源,它们感知不到彼此的存在,也不会互相干扰。这里顺便复习一下实现TCC模型的一个关键...

2019-07-07 22:21:48 1226

原创 [分布式事务-TCC] 5. TCC的优化方案之二:同库优化

同库优化在上一篇文章中,介绍了最末参与者优化(LPO),它能够减少网络调用的开销。减少网络调用不仅是降低了RT,更重要的是将系统执行的时序复杂度降低了。在对数据一致性有一定要求的高并发场景下,还是能够起到很大的作用。进行最末参与者优化后的时序如下:以减少网络调用次数和每次调用的耗时为切入点,我们来思考一下看看还有没有优化的空间。注意到发起方需要和TC的几次交互如下:分布式事务开始时,...

2019-07-07 22:10:08 915

原创 [分布式事务-TCC] 4. TCC的优化方案之一:最末参与者优化(LPO)

文章导航优化动机和指导原则最末参与者优化(LPO)优化动机和指导原则当一笔分布式事务的参与者较多时,同时每个参与者都涉及到一阶段和二阶段,还有异常场景下的幂等控制,空回滚以及防资源悬挂处理,调用关系会显著复杂化。特别当业务并发量很大的情况下。比如国内领先的第三方支付场景,并发量在高峰期十分惊人。那么如何尽可能地提高分布式事务的性能就是一个值得深入思考的问题。其实优化的原则也很直观:在能够满...

2019-07-01 23:14:34 1208

原创 [分布式事务-TCC] 3. TCC两个阶段的流程图

TCC两个阶段总结TCC作为分布式事务的一种具有强实时性保证的解决方案,其主要思想在于资源预留。在一切顺利的情况下,一阶段TRY还是很容易理解的。只不过为了保证在各种异常场景下,TCC都能够正常的工作,会添加不少异常处理手段。为了把两个阶段的行为梳理清楚,绘制了下面的流程图作为总结。涉及到的具体细节,可以结合前面的讨论进行回顾。一阶段 - TRY二阶段 - CONFIRM/CANCEL...

2019-06-26 21:21:46 2835 2

原创 [分布式事务-TCC] 2. TCC的异常场景及应对机制

文章导航TCC的异常场景幂等处理产生原因应对策略空回滚产生原因应对策略资源悬挂产生原因应对策略三种异常总结幂等空回滚资源悬挂共通点TCC的异常场景在分布式系统中,随时随地都需要面对网络超时,网络重发和服务器宕机等问题。所以分布式事务框架作为搭载在分布式系统之上的一个框架型应用也绕不开这些问题。具体而言,有以下常见问题:幂等处理空回滚资源悬挂这些异常的应对需要TCC框架的支持和解决方...

2019-06-16 21:40:33 13570 5

原创 [分布式事务-TCC] 1. 分布式事务的由来和TCC的核心思想和工作流程

文章导航分布式事务的由来和TCC的核心思想和工作流程写在前面引子TCC是什么TCC的核心思想TCC关联概念TCC调用一个例子:转账场景下的TCC实现分布式事务的由来和TCC的核心思想和工作流程写在前面分布式事务是一个大的命题,有很多相关的技术和细节。网上介绍这个主题的文章也是多如牛毛,但是能把问题的来龙去脉给讲清楚的文章并不多。我也不敢说自己就一定能够把这个本来就很复杂的事情讲的有多通透。...

2019-06-15 21:33:28 1585 1

原创 CLH锁的原理和实现

前情回顾上一篇文章中主要讨论了MCS自旋锁的特点和其适用场景,并分析了其原理和实现细节。MCS锁存在的问题MCS锁解决了简单自旋锁的一个最大痛点:频繁地缓存同步操作会导致繁重的系统总线和内存的流量,从而大大降低了系统整体的性能。解决这个问题的思路是将自旋操作限制在一个本地变量上,从而在根本上避免了频繁地多CPU之间的缓存同步。但是MCS锁的实现并不简单,需要注意的事项主要有以下...

2018-04-07 16:12:17 8312 3

原创 MCS锁的原理和实现

前情回顾上一篇文章中主要讨论了自旋锁的特点和其适用场景,然后给出了两种自旋锁的简单实现。存在的问题无论是简单的非公平自旋锁还是公平的基于排队的自旋锁,由于执行线程均在同一个共享变量上自旋,申请和释放锁的时候必须对该共享变量进行修改,这将导致所有参与排队自旋锁操作的处理器的缓存变得无效。如果排队自旋锁竞争比较激烈的话,频繁的缓存同步操作会导致繁重的系统总线和内存的流量,从而大大降低了...

2018-04-01 22:51:47 5114 5

原创 简单的非公平自旋锁以及基于排队的公平自旋锁的实现

基础什么是自旋锁由于本文主要讨论的都是自旋锁,所以首先就需要弄明白什么是自旋锁。自旋锁最大的特征,就是它会一直循环检测锁的状态,当锁处于被占用的状态时,不会将当前线程阻塞住,而是任由它继续消耗CPU Cycles,直到发现需要的锁处于可用状态。有了这一层了解,自旋锁的优势和劣势,以及其适用场景也就一目了然了。优势:没有线程阻塞,也就没有了线程上下文切换带来的开销...

2018-03-24 14:47:52 1535

原创 为什么volatile++不是原子性的?

问题在讨论原子性操作时,我们经常会听到一个说法:任意单个volatile变量的读写具有原子性,但是volatile++这种操作除外。所以问题就是:为什么volatile++不是原子性的?答案因为它实际上是三个操作组成的一个符合操作。首先获取volatile变量的值将该变量的值加1将该volatile变量的值写会到对应的主存地址一个很简单的例子:如果两个线程在...

2018-03-18 21:23:19 10569 9

原创 [Spring Boot] 5. Spring Boot中的ApplicationContext - 执行ApplicationContextInitializer初始化器

前面已经对Spring Boot启动过程进行过源码分析,对于代表容器上下文的关键字段ApplicationContext只是一笔带过。实际上,它的生命周期才应该是重点关注的。Spring Boot使用的ApplicationContext分两种场景,常规应用和Web应用使用的上下文类型不一样:常规应用:org.springframework.context.annotation.Annotatio

2017-08-27 12:50:17 17606 1

原创 [Spring Boot] 4. Spring Boot实现自动配置的原理

入口注解类@EnableAutoConfiguration@SpringBootApplication注解中包含了自动配置的入口注解:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration

2017-08-27 12:44:17 15912 1

原创 [Spring Boot] 3. Spring Boot实现自动配置的基础

在第一篇文章介绍Spring Boot启动过程,提到了Spring Boot的核心能力 - 自动配置。这个能力也是Spring Boot非常大的卖点之一。对这个能力,相信很多同学都会比较好奇,Spring Boot是如何实现它的呢?但是在详细探究Spring Boot是如何实现自动配置之前,首先需要明确问题的来源是什么,以及了解目前Spring框架中提供的相关能力。引子问题是什么Spring中纷繁复

2017-08-20 23:00:20 4429 1

原创 [Spring Boot] 2. Spring Boot 启动过程定制化

在上一篇文章中,从源码角度介绍了Spring Boot的启动过程。启动的代码虽然只有短短的一行,但是背后所做的工作还真不少,其中有一些可以定制化的部分,主要分为以下几个方面:初始化器(Initializer)监听器(Listener)容器刷新后置Runners(ApplicationRunner或者CommandLineRunner接口的实现类)启动期间在Console打印Banner的具体

2017-08-13 22:45:21 6051 1

原创 [Spring Boot] 1. Spring Boot启动过程源码分析

关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到如今可以这么简便。1. 入口类package com.example.demo;import org.springframework.boot.SpringApplication;import org

2017-08-05 21:25:54 26501 5

原创 [AOP] 7. 一些自定义的Aspect - Circuit Breaker

Circuit Breaker(断路器)模式关于断路器模式是在微服务架构/远程调用环境下经常被使用到的一个模式。它的作用一言以蔽之就是提高系统的可用性,在出现的问题通过服务降级的手段来保证系统的整体可用,而不至于因为部分问题导致整个系统不可用。用下面这张图可以很好的说明它能够解决的问题: 图片引用自参考资料1。其中从client和supplier可以分别理解成调用者和远程方法。在没有Circuit

2017-07-30 13:40:12 1342

原创 [AOP] 6. 一些自定义的Aspect - 方法的重试(Retry)

前面的一系列文章介绍了AOP的方方面面:AOP的由来以及快速上手AOP的两种实现-Spring AOP以及AspectJSpring AOP中提供的种种Aspects - Tracing相关Spring AOP中提供的种种Aspects - 异步执行Spring AOP中提供的种种Aspects - 并发控制从本篇文章开始,会介绍一些基于AOP原理的自定义Aspect实现,用来解决在开发

2017-06-03 12:01:10 2958 2

原创 [AOP] 5. Spring AOP中提供的种种Aspects - 并发控制

本文继续讨论ConcurrencyThrottleInterceptor(基于Spring 4.3.7)。以及上一篇文章中遗留的一个关于SimpleAsyncTaskExecutor类中属性concurrencyLimit的问题。这些都和并发控制相关。但是这里需要事先说明的一点是,这些类和实现的年代都比较久远了,比如ConcurrencyThrottleInterceptor是在2004年的Spri

2017-04-05 11:30:22 4868

原创 [AOP] 4. Spring AOP中提供的种种Aspects - 异步执行

上一篇文章介绍了Spring AOP中提供的种种与Tracing相关的Aspects,还剩两个Aspects没有讨论:AsyncExecutionInterceptorConcurrencyThrottleInterceptor本文继续探讨和异步与并发相关一个Aspect,也是使用的比较普遍的一个:AsyncExecutionInterceptor在下篇文章中会继续讨论Concurrenc

2017-03-19 15:52:39 7940

原创 [AOP] 3. Spring AOP中提供的种种Aspects - Tracing相关

在第一篇文章中,介绍了AOP的一些背景知识以及如何快速上手,然后在第二篇中详细分析了AOP的两种实现 - Spring AOP以及AspectJ。本文偏向于实践,继续介绍Spring AOP中提供的种种Legacy Aspects。虽然这些Aspects的历史已经比较久远了(好多都是在Spring 1.x时代就存在了),但是并不妨碍我们理解它们背后蕴含的思想以及见识AOP能够解决的问题域。了解这些现

2017-03-11 17:32:48 8229 1

原创 [AOP] 2. AOP的两种实现-Spring AOP以及AspectJ

在接触Spring以及种类繁多的Java框架时,很多开发人员(至少包括我)都会觉得注解是个很奇妙的存在,为什么加上了@Transactional之后,方法会在一个事务的上下文中被执行呢?为什么加上了@Cacheable之后,方法的返回值会被记录到缓存中,从而让下次的重复调用能够直接利用缓存的结果呢?随着对AOP的逐渐应用和了解,才明白注解只是一个表象,在幕后Spring AOP/AspectJ做了大

2017-02-26 22:29:18 22044 9

原创 [AOP] 1. AOP的由来以及快速上手

AOP从何而来技术的演化从来都不是随机现象。往往都是为了应对某种特定的问题,而形成的一系列切实可行解决方案或者优雅的最佳实践,然后把它们汇聚在一起,就形成了一个工具,一个库或者是一个框架。为应对Cross-cutting问题而生要了解AOP(Aspect Oriented Programming,面向切面编程)从何而来,首先来看看下面这段代码:public void doBusinessLogic(

2017-02-25 14:44:22 3222

原创 [JavaEE - JPA] 性能优化: 如何定位性能问题

要想解决性能问题,首先得要有办法定位问题。而JPA的性能问题,可以说99%都是因为JPA Provider(一般使用的都是Hibernate,或者EclipseLink)生成的SQL效率低下或者生成并执行了你意料之外的SQL。针对这个问题,其实不需要多么复杂的调试工具,一般而言JPA Provider就会提供一些基础的性能分析工具,以Hibernate为例(EclipseLink等其它JPA Pro

2016-12-03 19:26:07 10982 5

原创 [JavaEE - JPA] 性能优化: 4种触发懒加载的方式

在一个JPA应用中,可以通过懒加载来提高应用的性能。这一点毋庸置疑,但是懒加载不等于不加载,在某个时刻还是需要加载这些数据的,那么如何触发这个加载的行为才能够事半功倍呢?这里我想说一点题外话,面试的时候我也会考察被面试者对于JPA/Hibernate的看法,得到的答复通常都包含了对JPA/Hibernate的一些”鄙夷”,比如JPA/Hibernate性能太菜了,现在主流的持久层框架是MyBatis

2016-11-27 23:16:11 17925

翻译 [Elasticsearch] 集群的工作原理 - 第二部分

本文翻译自Elasticsearch官方指南的life inside a cluster一章。增加故障转移(Failover)功能只运行一个节点意味着可能存在着单点失败(Single point of failure)的问题 - 因为没有冗余。幸运的是,解决这个问题我们只需要启动另一个节点。启动第二个节点为了试验当你添加第二节点时会发生什么,你需

2016-11-25 15:34:13 17807 3

原创 [JavaEE - JPA] 7. ORM的核心注解 - 关系类型

本文继续介绍JPA ORM的核心注解中和关系映射相关的部分。关系映射的处理绝对是一个JPA应用最为重要的部分之一。关系映射处理的好,不仅仅是建模上的成功,而且在程序性能上也会更胜一筹。关系映射处理的不好很容易造成程序性能底下,各种Bug频繁出现,而且这些Bug通常还会比较隐蔽,总是在关键时刻掉链子。我想这也是为什么很多开发人员说JPA入门容易,精通难得原因之一。因为关系确实不是那么好处理的,不仅需要

2016-10-20 21:40:11 3233 1

原创 [JavaEE - JPA] 6. ORM的核心注解 - 基础类型以及嵌套类型

本文继续介绍JPA ORM的核心注解中和基础类型映射相关的部分。基础类型映射所谓的基础类型映射,实际上就是Java中定义的数据类型应该如何被JDBC转换成数据库所支持的数据类型。而这些基础类型,主要包括了以下9种:简单类型:byte,int,short,long,boolean,char,float以及double简单类型对应的包装类型:Byte,Integer,Short,Long,Boole

2016-10-17 22:26:29 3282

原创 [JavaEE - JPA] 5. ORM的核心注解 - 访问方式,表映射以及主键生成

从本篇文章开始,会系统性地介绍JPA中用来实现对象关系映射(Object Relational Mapping)的核心注解,以及基础类型,关系类型,嵌套类型以及集合类型的映射方式。注解种类在探讨实现JPA中各种映射的方式之前,可以先看看JPA中的注解类型。 由于ORM这一机制涉及到了两个方面:对象(内存模型)以关系数据(关系型数据库)。而显然我们在配置ORM的各种规则时,只能在Java程序中完成。

2016-09-28 23:40:38 3699

原创 [JavaEE - JPA] 4. EntityManager相关核心概念

前三篇文章花了一些笔墨介绍了事务的概念以及在EJB和Spring Framework中分别是如何完成事务管理的。之所谓花了比较大的代价来介绍事务主要也是因为不管在什么类型的持久化应用中,都包含下面两个关键点:事务管理对象关系映射(ORM)而JPA主要定义的就是和对象关系映射(ORM)相关的内容。从本篇文章开始,会系统性地介绍JPA的方方面面。核心概念及其关联关系首先,当然

2016-09-27 00:01:31 4910

原创 [JavaEE - JPA] 3. Spring Framework中的事务管理

前文讨论了事务划分(Transaction Demarcation)在EJB中是如何实现的,本文继续介绍在Spring Framework中是如何完成事务划分的。我们已经知道了当采用Container事务类型的时候,事务划分主要有以下两种方案(参考这里):使用JTA接口在应用中编码完成显式划分在容器的帮助下完成自动划分在使用JavaEE的EJB规范时,这两种方案分别被实现为BMT

2016-09-23 23:05:23 6040

原创 [JavaEE - JPA] 2. EJB中的事务管理

在上一篇文章中介绍了事务的基本概念,包括事务的ACID性质,以及事务的类型并且稍微提到了事务划分。对于任何一个需要持久化数据的应用而言,事务划分(Transaction Demarcation)的规划都是非常重要的一环。如果规划的不好,轻则影响性能,重则会导致在某些情况下数据发生不一致,从而严重影响业务逻辑的顺利进行。本文继续介绍事务划分在当前JavaEE技术体系下基于EJB的实现方案。虽然EJB算

2016-09-19 00:35:16 4728

原创 [JavaEE - JPA] 1. 事务的基础概念

现在任何应用都需要数据持久化。否则就不算是一个完整的应用。那么对于一个数据持久化而言,最重要的无外乎两方面:事务管理(Transaction Management)对象关系映射(Object Relational Mapping)本文作为JPA(Java Persistence API)这一系列文章的首篇,就来先谈谈事物管理相关的一些概念和基础。事务(Transaction, TX)事务管理,

2016-09-17 23:34:16 4251 1

原创 [AngularJS面面观] 24. 依赖注入 --- Value以及Decorator

module中定义的高层API现在已经介绍的差不多了,本文就把后面剩下的几个能介绍的先介绍了(不能介绍的还有蛮多的,比如filter,controller,directive,这些使我们后面讨论的内容,敬请期待 :) )。和依赖注入关系比较紧密的剩下2个方法分别是value和decorator。Value在angular中,比较常见的问题除了service,factory和provider三者之间有

2016-08-28 18:55:47 5572 2

原创 [AngularJS面面观] 23. 依赖注入 --- Factory vs Service

据说99%的angular的初学者都会有一个疑问:factory和service到底有什么区别?什么情况该用factory,而什么情况又该用service呢?比如这个Stackoverflow上的这个问题:Service vs Factory,又或者是这个问题:Service vs Provider vs Factory。这些问题都有热心答主回答的很棒了,能够解释清它们共同点,区别以及典型用法。因此

2016-08-26 00:00:01 4302

原创 [AngularJS面面观] 22. 依赖注入 --- 配置队列以及运行队列

在上一篇文章中,介绍了constant的生命周期:它是如何被定义的,如何被创建,如何被使用的。本文继续介绍module上更多高层API的实现细节。在继续阅读下面的内容之前,还是建议对依赖注入本身要有足够的理解,当然如果你是跟着依赖注入的这一系列文章一路走来,对angular实现依赖注入的方式和细节应该是比较熟悉了。本文会介绍定义与module上的两个方法:module.config以及modu

2016-08-21 14:14:58 3880

原创 [AngularJS面面观] 21. 依赖注入 --- constant到底如何而来

在上一篇文章中,我们终于见到了angular中依赖注入的总体结构图。从这幅图中我们可以知道在angular内部是有两个注入器协同工作来实现我们习以为常的依赖注入特性的。结合上图简单回顾一下angular依赖注入的组成和工作流程。首先,在台面上的注入器名为实例注入器(Instance Injector),它里面含有一个名为实例缓存(Instance Cache)的字典对象,该缓存的作用是

2016-08-19 23:11:01 8465

原创 [AngularJS面面观] 20. 依赖注入 --- instance注入器以及provider注入器

本文就来解答上一篇文章留下的疑问,为什么在注入器也分成了instance注入器和provider注入器。这两种注入器的工作原理是怎么样的。总体结构为此我特别准备了一张图来描述一下angular注入器的工作流程和原理,如下所示。这张图的顶部是外部调用的入口,即通过angular暴露给外部的injector服务。关于injector服务。关于injector服务中含有的五个方法,在

2016-08-13 22:08:41 4745 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除