自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不忘初心,好好沉淀

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

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

对于支持CSP并发编程模型的Golang而言,要实现一个协程池是非常简单的。对于习惯了基于线程模型完成并发编程的开发同学,可能初次接触会有点难理解,但是俗话说"书读百遍其义自见",百来行的代码也并不多。 我们的目标是实现一个具有以下特性的协程池(熟悉Java的话,基本上就是实现...

2020-04-05 14:02:19 96 0

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

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

2019-07-13 20:43:12 169 0

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

文章导航JDK 8 函数式编程最佳实践1. Lambda表达式的重要接口1.1 新增的函数接口1.1 无参数,无返回值类型接口1.2 无参数,有返回值类型接口1.3 有参数,也有返回值的类型接口2. 方法引用2.1 静态方法引用2.2 实例方法引用2.3 构造方法引用3. 使用Lambda表达式完...

2019-07-12 21:05:12 319 0

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

二阶段异步化 采用TCC模型实现分布式事务之后,分布式事务所需的资源也是按照业务的维护进行切分,每笔分布式事务之间的资源都是独立预留和消费。 单说这些可能有点难理解举个栗子就很容易理解了,账户A同时参与了两笔分布式事务,一笔是转账50元到账户B;另一笔是转账100元到账户C。 那么每笔分布式事务都...

2019-07-07 22:21:48 182 0

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

同库优化 在上一篇文章中,介绍了最末参与者优化(LPO),它能够减少网络调用的开销。减少网络调用不仅是降低了RT,更重要的是将系统执行的时序复杂度降低了。在对数据一致性有一定要求的高并发场景下,还是能够起到很大的作用。 进行最末参与者优化后的时序如下: 以减少网络调用次数和每次调用的耗时为切入点...

2019-07-07 22:10:08 133 0

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

文章导航优化动机和指导原则最末参与者优化(LPO) 优化动机和指导原则 当一笔分布式事务的参与者较多时,同时每个参与者都涉及到一阶段和二阶段,还有异常场景下的幂等控制,空回滚以及防资源悬挂处理,调用关系会显著复杂化。特别当业务并发量很大的情况下。比如国内领先的第三方支付场景,并发量在高峰期十分惊人...

2019-07-01 23:14:34 250 0

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

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

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

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

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

2019-06-16 21:40:33 1242 0

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

文章导航分布式事务的由来和TCC的核心思想和工作流程写在前面引子TCC是什么TCC的核心思想TCC关联概念TCC调用一个例子:转账场景下的TCC实现 分布式事务的由来和TCC的核心思想和工作流程 写在前面 分布式事务是一个大的命题,有很多相关的技术和细节。网上介绍这个主题的文章也是多如牛毛,但是能...

2019-06-15 21:33:28 237 0

原创 CLH锁的原理和实现

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

2018-04-07 16:12:17 3925 2

原创 MCS锁的原理和实现

前情回顾 上一篇文章中主要讨论了自旋锁的特点和其适用场景,然后给出了两种自旋锁的简单实现。 存在的问题 无论是简单的非公平自旋锁还是公平的基于排队的自旋锁,由于执行线程均在同一个共享变量上自旋,申请和释放锁的时候必须对该共享变量进行修改,这将导致所有参与排队自旋锁操作的处理器的缓存变得无...

2018-04-01 22:51:47 1959 2

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

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

2018-03-24 14:47:52 731 0

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

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

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

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

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

2017-08-27 12:50:17 14852 0

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

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

2017-08-27 12:44:17 13424 0

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

在第一篇文章介绍Spring Boot启动过程,提到了Spring Boot的核心能力 - 自动配置。这个能力也是Spring Boot非常大的卖点之一。对这个能力,相信很多同学都会比较好奇,Spring Boot是如何实现它的呢?但是在详细探究Spring Boot是如何实现自动配置之前,首先需...

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

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

在上一篇文章中,从源码角度介绍了Spring Boot的启动过程。启动的代码虽然只有短短的一行,但是背后所做的工作还真不少,其中有一些可以定制化的部分,主要分为以下几个方面: 初始化器(Initializer) 监听器(Listener) 容器刷新后置Runners(ApplicationRunn...

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

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

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

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

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

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

2017-07-30 13:40:12 857 0

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

前面的一系列文章介绍了AOP的方方面面: AOP的由来以及快速上手 AOP的两种实现-Spring AOP以及AspectJ Spring AOP中提供的种种Aspects - Tracing相关 Spring AOP中提供的种种Aspects - 异步执行 Spring AOP中提供的种种Asp...

2017-06-03 12:01:10 2008 0

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

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

2017-04-05 11:30:22 3921 0

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

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

2017-03-19 15:52:39 6417 0

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

在第一篇文章中,介绍了AOP的一些背景知识以及如何快速上手,然后在第二篇中详细分析了AOP的两种实现 - Spring AOP以及AspectJ。本文偏向于实践,继续介绍Spring AOP中提供的种种Legacy Aspects。虽然这些Aspects的历史已经比较久远了(好多都是在Spring...

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

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

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

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

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

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

2017-02-25 14:44:22 2765 0

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

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

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

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

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

2016-11-27 23:16:11 14636 0

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

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

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

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

本文继续介绍JPA ORM的核心注解中和关系映射相关的部分。关系映射的处理绝对是一个JPA应用最为重要的部分之一。关系映射处理的好,不仅仅是建模上的成功,而且在程序性能上也会更胜一筹。关系映射处理的不好很容易造成程序性能底下,各种Bug频繁出现,而且这些Bug通常还会比较隐蔽,总是在关键时刻掉链子...

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

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

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

2016-10-17 22:26:29 2945 0

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

从本篇文章开始,会系统性地介绍JPA中用来实现对象关系映射(Object Relational Mapping)的核心注解,以及基础类型,关系类型,嵌套类型以及集合类型的映射方式。注解种类在探讨实现JPA中各种映射的方式之前,可以先看看JPA中的注解类型。 由于ORM这一机制涉及到了两个方面:对...

2016-09-28 23:40:38 3346 0

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

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

2016-09-27 00:01:31 4097 0

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

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

2016-09-23 23:05:23 5645 0

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

在上一篇文章中介绍了事务的基本概念,包括事务的ACID性质,以及事务的类型并且稍微提到了事务划分。对于任何一个需要持久化数据的应用而言,事务划分(Transaction Demarcation)的规划都是非常重要的一环。如果规划的不好,轻则影响性能,重则会导致在某些情况下数据发生不一致,从而严重影...

2016-09-19 00:35:16 4186 0

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

现在任何应用都需要数据持久化。否则就不算是一个完整的应用。那么对于一个数据持久化而言,最重要的无外乎两方面: 事务管理(Transaction Management) 对象关系映射(Object Relational Mapping) 本文作为JPA(Java Persistence API)这一...

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

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

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

2016-08-28 18:55:47 5318 1

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

据说99%的angular的初学者都会有一个疑问:factory和service到底有什么区别?什么情况该用factory,而什么情况又该用service呢?比如这个Stackoverflow上的这个问题:Service vs Factory,又或者是这个问题:Service vs Provide...

2016-08-26 00:00:01 4081 0

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

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

2016-08-21 14:14:58 3619 0

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

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

2016-08-19 23:11:01 7832 0

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

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

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

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