• 等级
  • 2694979 访问
  • 149 原创
  • 1 转发
  • 1126 排名
  • 404 评论
  • 816 获赞

CLH锁的原理和实现

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

2018-04-07 16:12:17

MCS锁的原理和实现

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

2018-04-01 22:51:47

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

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

2018-03-24 14:47:52

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

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

2018-03-18 21:23:19

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

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

2017-08-27 12:50:17

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

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

2017-08-27 12:44:17

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

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

2017-08-20 23:00:20

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

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

2017-08-13 22:45:21

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

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

2017-08-05 21:25:54

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

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

2017-07-30 13:40:12

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

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

2017-06-03 12:01:10

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

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

2017-04-05 11:30:22

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

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

2017-03-19 15:52:39

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

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

2017-03-11 17:32:48

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

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

2017-02-26 22:29:18

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

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

2017-02-25 14:44:22

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

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

2016-12-03 19:26:07

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

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

2016-11-27 23:16:11

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

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

2016-11-25 15:34:13

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

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

2016-10-20 21:40:11

博客专家

dm_vincent

关注
奖章
  • 持之以恒