自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(264)
  • 资源 (15)
  • 收藏
  • 关注

原创 并发编程理论 - AQS源码分析

目录底层核心方法独占模式 acquire release共享模式 acquireShared releaseSharedConditionObject核心方法 await signal、signalAll AQS源码大致分为独占(acquire【获取独占】、release【释放独占】)和共享(acquireShared【获取共享】、releaseShared【释放共享】)两种模式,而其AQS模板方法会调用tryAcquir...

2020-11-19 19:48:35 14

原创 并发编程理论 - AQS之双向链表和条件队列数据结构

目录一、双向链表的Node节点结构二、AQS结构梳理三、state与双向链表模型四、核心模板方法分析 1、tryAcquire 2、tryRelease 3、tryAcquireShared 4、tryReleaseShared 根据上一篇理解了Doug Lea设计AQS的意图和思路,AQS作为抽象的模板方法在其中完成了大量的同步方法的封装,分为排他和共享两个模式。所以我们的理解思路就是先看看state值与虚拟双向链表【以及Condition...

2020-11-18 09:25:48 59

原创 并发编程理论 - AQS的设计意图和扩展用法

提供了一个实现阻塞锁和相关同步器(信号量、事件等)的框架,这些同步器依赖于先进先出的oqt (FIFO)等待队列。对于大多数依赖于单个原子值{@code int}来表示状态的同步器来说,这个类被设计为一个有用的基础。子类必须定义更改此状态的受保护方法,并定义该状态在被获取或释放的对象中意味着什么。给定这些,这个类中的其他方法执行所有排队和阻塞机制。子类可以维护其他的状态字段,但是只有原子更新的{@code int,使用方法{@link #getState}、@link #setSta...

2020-11-11 22:39:25 54

原创 并发编程理论 - Future体系和FutureTask实现原理

目录1、Future2、RunnableFuture3、FutureTask 1)、FutureTask结构 2)、FutureTask实现原理(LockSupport的park+自旋、unpark实现的等待唤醒机制) 我们知道并发编程可以使用Runnable【源码标注@since jdk1.0】不带返回值的回调函数,也可以使用Callable<V> 【源码标注Callable @since 1.5 并且由并发大师Doug Lea编写】带返回值的回调函数...

2020-11-09 23:36:08 37 1

原创 并发编程工具 - AtomicReferenceFieldUpdater、并发修改同一对象的不同属性会有问题吗?

并发修改同一对象的不同属性会有问题吗? 当调用Tomcat等Web服务器时,会交给Tomcat的某一线程处理请求,为了提高接口的性能缩短返回时间,将能并行的任务放到Runnable/Callable中,知道Callable能返回Future进行有返回值的结果处理,但是那样的程序写出来会比较繁琐。所有很多时候直接用Runnable + 线程安全的容器存储(比如ConcurrentHashMap)每个线程池的值;当然很多时候我们返回的可能就是一个对象,比如:商品明细接口返回的对象中,即包含价格信...

2020-11-06 17:04:08 46

原创 并发编程工具 - juc的atomic工具类、AtomicInteger的项目使用

目录atomic包的实现原理atomic包的工具分类AtomicInteger分析和项目使用 juc下面的atomic包下面所以的工具类都没有使用AQS,但是却是线程安全的(基于volatile + CAS)。由于没有使用AQS双向队列(底层没有使用LockSupport的park和unpark),则并没有互斥锁,所以可以理解成线程安全的无锁工具类。atomic包的实现原理 1)、volatile关键字基于JVM屏蔽底层的内存屏障差异,但都解决了有序性(防止指令重排序)的...

2020-11-06 14:22:25 31 2

原创 并发编程工具 - ForkJoinTask(多线程分治算法)

分治是算法中比较常用的手段,一种解决复杂问题的思维方法和模式;把一个复杂的问题分解成多个相似的子问题,然后再把子问题分解成更小的问题,直到问题简单到可以直接求解。而大数据框架mapReduce就是分治的实现,在juc下面也提供了ForkJoinTask来处理该场景。Fork、Join计算框架主要用于处理CPU型任务,主要包含分治任务线程池 ForkJoinPool和分治任务ForkJoinTask。分治任务模型如下图: ForkJoinTask按照是否有返回值分为两个子类实现:1)...

2020-11-04 15:13:24 21

原创 并发编程工具 - CompletableFuture的API和项目使用

目录一、CompletableFuture的API 1、CompletableFuture整体结构 2、按照类型分类 3、按照关系分类二、CompletableFuture的demo、项目使用 1、使用Demo 2、自己项目上的使用 并发编程时的可以并行的应用场景非常多,比如C依赖于A、B并行的结果,但是整体可以和D并行等,如果是Java8之前的话,则需要将任务封装成每个Runnable(或者Callable)也可以实现。但是Java8增加...

2020-11-03 16:49:50 66

原创 并发编程工具 - CompletionService源码和项目使用

并发编程应用场景的时候经常遇到处理批量任务的情况,那么使用ThreadPoolExecutor#invokeAll、或者使用CountDownLatch协调,可以见上一篇的项目使用场景,当然CompletionService本身也可以实现。更复杂的场景:当执行批量任务回来,每个都还有后续的操作,并行不想等到所以结果返回再处理后续的结果,而是先回来就先处理,那么要是我们自己会怎么处理呢,可以将其放入线程安全的队列,阻塞获取队列的结果,比如:/** * 批量执行任务 * * 保存价格数据...

2020-11-03 10:53:28 29

原创 并发编程工具 - 线程池的使用和自己的封装

目录线程池的使用线程池参数设置自己封装的线程池工具 根据阿姆达尔(Amdal)定律可知[并发编程基础 - 安全性、活跃性、性能问题#性能问题],若串行度为5%那么无论使用任何技术,性能最高提升20%,所以减小串行度(减小锁粒度、算法优化等)是前提。但是除此之外使用多线程并行任务也是比较常用的手段,效果也非常明显,只是使用不好坑会非常多,所以最好深入理解其运行原理,这当然也是面试的高频。线程池的使用 上面的多线程并行是最理想的状态,真正执行的时候与CPU的核数(并行度...

2020-11-02 14:09:54 57

原创 并发编程工具 - Tomcat对ThreadPoolExecutor线程池的扩展

目录1、Tomcat定制自己的TaskThreadFactory2、Tomcat定制TaskQueue集成自LinkedBlockeingQueue3、Tomcat定制扩展ThreadPoolExecutor 分析完juc的线程池源码并发编程工具 - ThreadPoolExecutor源码解析,理解了线程池执行的过程(即 execute(Runnable runnable)),再回顾一下线程池的执行源代码:当一个新的任务(Runnable)进入:1、如果不足核心线程数,直..

2020-11-01 23:37:49 20

原创 并发编程工具 - ThreadPoolExecutor源码解析

目录AtomicIntegerctl表示了线程池的生命周期线程池状态和转换过程execute(Runnable command)添加任务,addWork(Runnable firstTask, boolean core)Worker结构执行任务,runWorker(Worker w)销毁线程,processWorkerExit 在(并发编程工具 - 线程池核心参数和工作原理)理解了ThreadPoolExecutor的层级结构、创建方式和工作原理之后,进入源码查询具体...

2020-11-01 15:35:42 20

原创 并发编程工具 - 线程池核心参数和工作原理

目录1、线程池的结构2、线程池的创建方式3、核心参数4、工作原理 线程池绝对的面试高频,确实因为多线程是解决并发问题特别是提升某些核心项目接口的利器,但是使用不好也存在大量的问题,那么搞清楚线程池的工作原理尤为重要。之前接触线程池基本都存在于面试阶段,但是当第一次在项目上看别人使用线程池解决并行任务时特别的震惊,项目上一个接口并行了17个子任务。现在已经基本在项目上都会使用线程池来解决核心问题,理解也比较深了才敢写这方面的博客【当然,理解线程池的原理就更为重要了,否则就是像在裸奔】...

2020-10-30 23:50:59 64 2

原创 并发编程基础 - 多线程的上下文切换问题

目录1、什么是线程上下文2、哪些可以引发上下文切换3、怎么查看上下文切换4、怎么减少上下文切换,对实际的应用场景的理解 记得在两年前,翻开《Java并发编程的艺术》开篇就讲的上下文切换可能使多线程比串行执行还慢,那时还是在硬看书的阶段上来直接就干懵了。并且在很多场景下串行的效率就是比并行还快,比如Redis、Nginx,但是他们的前提是场景问题,主要的问题是在于处理IO问题,于是引入Reactor模型(select、poll、epoll)的支持,所以个人理解还是要对自己项目的性质有...

2020-10-29 00:51:29 45

原创 并发编程基础 - synchronized和volatile并发模型对比、从顶层俯瞰juc

目录一、juc包存的意义【解决了synchronized没有解决的部分问题】1、能够响应中断2、支持超时3、非阻塞地获取锁二、juc包个人理解分为三个部分1、atomic工具包2、AQS3、线程池三、LockSupport和Unsafe类四、CAS存在的问题和解决方案1、ABA问题2、单个对象问题 synchronized关键字不仅要解决原则性可见性和有序性问题,还需要Object(ObjectMonitor)相关方法等周边配置一起才能解决所有的并发问题,虽..

2020-10-25 15:31:59 26

原创 并发编程基础 - synchronized锁优化

目录1、锁消除和锁粗化2、锁内部优化1、偏向锁2、轻量级锁3、重量级锁(Jdk6之前的Synchronized锁) 在Jdk6之前都认为synchronized是非常中的互斥锁,性能非常低,这是我一开始编程就固有的印象也是面试高频,高效并发是Jdk5升级到Jdk6中做的重要的改进。由于我们开发的项目所属于的行业(比如传统行业,电商行业等),对并发的要求不同(Tps差异很多倍),开发人员的基本功差距等不可用因素非常多。具体生产环境中运行的场景非常多,那么久需要针对性具体进行优化。..

2020-10-24 17:19:31 36

原创 并发编程基础 - synchronized使用场景和等待唤醒机制的正确姿势

在理解完synchronized关键字反汇编之后信息,基于内存屏障解决了可见性和有序性,再基于MESA管程模型解决了线程的互斥和同步,并且顺便将执行的过程封装起来,中间状态对外不可见,解决了原子性。重点是理解管程模型是理解synchronized使用的关键,也理解了其模型,如图:1、synchronized使用场景1)、普通方法(锁的的对象,当同一个对象的多个synchronized方法才互斥) 该使用场景比较多,比如SringBuffer的几乎所以方法:2)、静态方...

2020-10-22 22:12:53 35 2

原创 并发编程基础 - 安全性、活跃性、性能问题

目录1、安全性问题 2、活跃性问题3、性能问题 如果原子性、可见性、有序性是并发编程微观的问题或诱因,那么安全性、活跃性和性能问题就是宏观的结果。1、安全性问题 安全性问题前面强调的比较多了,只要多线程能并发读写的数据,没有解决原子性、可见性、有序性任一问题都会照成数据不安全(得不到我们期望的值 或者 程序不是按照我们期望的运行),2、活跃性问题 活跃性3、性能问题 性能...

2020-10-22 14:59:17 28

原创 并发编程基础 - 死锁

目录1、为什么会发生死锁2、怎样避免死锁3、线上项目应用场景 应该说死锁也算是面试的高频了,那么面试官需要知道什么,希望你回答什么。我觉得从下面几个点切入,怎么会发生死锁,怎样避免,在项目中的实际应用场景。欢迎指正、讨论。1、为什么会发生死锁2、怎样避免死锁所发生的3、线上项目应用场景 1)、批量获取分布式锁 2)、多层synchronized场景...

2020-10-21 22:39:53 16

原创 并发编程基础 - Thread状态和生命周期

目录1、线程状态NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED2、线程状态的转换NEW -> RUNNABLERUNNABLE -> BLOCKEDBLOCKED -> RUNNABLERUNNABLE -> WAITINGWAITING -> RUNNABLERUNNABLE -> TIMED_WAITINGRUNNABLE -> TERMINATED

2020-10-21 16:45:02 23

原创 并发编程基础 - MESA管程模型和synchronized原子性

通过上一篇我们知道通过内存屏障,在反编译的汇编语言中我们看到基于lock cmpxchg和lock addl 前置指令解决了synchronized和volatile的可见性和有序性问题。也在反汇编中看到了synchronized中的monitorenter和monitorexit,这是synchronized实现原子性的关键。monitor可以叫监视器,也可以翻译为管程,并不是java特有的产物。并发过程中除了有线程原子性的问题,我们还需要解决线程间的互斥还得数据同步。 在解决并发问题的...

2020-10-20 23:53:15 105

原创 并发理论基础 - synchronized、volatile与内存屏障(解决可见性和有序性)

前面提到了由于计算机发展各个设备发展速度的问题,计算机为了均衡1、内存屏障 内存屏障

2020-10-20 16:57:15 53

原创 并发理论基础 - JMM模型和Happens-Before规则

针对前面提到的多线程情况下,可能会出现的原子性,可见性和有序性问题。既然存在问题,那么则需要程序员在必要时能按需禁用高速缓存和编译优化,当然该禁用是打引号的,真实的实现方式是使用内存屏障保证CPU指令的正确执行。Java的解决方案就是JMM(Java Memory Model)模型,和六项Happens-Before原则,具体体现在 synchronized、volatile、final关键字上面(至于关键字都做了什么,还有什么没有解决后续再挨个分析)。一、从并发角度理解JMM 针对前...

2020-10-17 16:49:12 38

原创 并发理论基础 - 并发问题的背景和根源(原子性、可见性、有序性)

并发编程不仅仅是Java语言的难题,其他语言也同样存在(一般都是中高级开发需要面临的问题)。问题的根源在于硬件设备CPU、内存、I/O在不断的迭代发展过程中产生了差异。CPU和内存的差异可以理解为天上一天地下一年,内存与I/O设备的差异就更大了,可以理解为天上一天地上十年【之前看到过各设备的速度比的图例,但是没有找到】。I/O不仅指磁盘的IO,随着现在微服务的发展,网络IO的延迟问题也越来越凸显。 根据木桶理论,程序整体的运行速度取决于短板,即当Cpu需要运行一条指令时,需要等待其...

2020-10-17 14:14:26 31

原创 并发编程模式 - Two-Phase Termination两阶段终止模式

当需要对正在执行指令的线程(或线程池任务)执行终止操作时,可以直接调用线程或线程池提供的Api,1、线程 Thread提供了stop方法,强制停止正在执行的线程任务,除非自己的任务正执行一半可以被停止【比如采集日志本身就允许采样率等】。否则一般可以使用interrupt方法执行终端操作。2、线程池 线程池(如ThreadPoolExecutor 父类ExecutorService)提供了shutdown方法,在执行完任务后自动关闭线程。当然我们也可以暴力的使用shutdo...

2020-10-17 10:04:54 38 1

原创 并发编程模式 - Balking模式

多线程情况下,定时判断文本、编辑器【如CSDN、Processon等】是否修改过,如果有修改过则进行保存,类似这样的场景称为Balking模式。特点:1、可以将表示修改的方法用synchronized或者Lock修饰2、使用volatile修饰,没有原则性要求。比如 Dubbo负载均衡会将服务的列表同步到本地,定时查询是否发送了变化3、还有一种无所的方式,volatile + 双重锁(Double Check)检查机制的单利实现传统的Balking模式写法如下:publi...

2020-10-16 08:39:12 18

原创 并发编程模式 - Guarded Suspension设计模式

Guarded Suspension翻译过来是受保护的暂停,主要就是为了解决在多线程环境下受保护性的访问资源,也是等待唤醒机制的规范实现。有的也叫做GuardedWait模式、Spin Lock模式(因为使用到了while循环等待),也叫做多线程版本的if。特点:受保护的资源,等待一个条件满足后通知 注册等待的访问者, 听着就像是Synchronized底层的实现机制,也确实有标准的Mesa管程模型推荐写法(标准,按着写就不会生出其他bug)。 MESA推荐的标准写法如下,但...

2020-10-15 22:57:11 35

原创 并发编码模式 - CopyOnWrite模式(COW)

解决线程处理共享数据除了之前的线程变量(ThreadLocal)和不可变(Immatable)模式外,还有一个方式就是CopyOnWrite模式(也叫COW ),但是有自己的适用场景。针对该模式 java juc提供了 CopyOnWriteArrayList、CopyOnWriteArraySet(底层使用CopyOnWriteArrayList保证去重实现)。一、使用场景1、读多写少2、数据量比较小3、对数据的一致性要求不是非常的高二、原理 读数据:直接进行读取...

2020-10-14 19:49:32 20

原创 并发编码模式 - Immutability不可变模式

并发编程存在线程安全的问题,但是如果在某些特定的情况下数据本身就不需要变动,则不会存在线程安全问题。Immutability不可变更多情况下是一种思想,自己在项目中经常使用的有两种情况。1、final关键字 很多时候当数据一旦建立就不会进行改变(哪怕在传递的过程中),那么Java的 final关键字就是JVM不变性的。比如自己项目中的使用场景,由于所有的微服务项目都会使用到线程池统一管理,所以管理就定义在了公共的maven中。但是每个应用要创建线程池的个数和参数信息只有自己服务本身能确...

2020-10-14 11:34:25 32

原创 Spring Cloud Feign超时设置

根据之前的Feign 源码分析,知道了Feign的整个配置项的加载,接口的动态代理创建和请求的执行过程。那么Hytrix、Feign、Ribbon三个的超时时间设置都会对请求产生影响,完全根据自己的业务进行判断。1、Hytrix配置# hystrix 配置feign: hystrix: enabled: true command: default: execution: isolation: ...

2020-10-13 22:54:23 60

原创 Spring Cloud Feign源码 - 总结

目录1、@EnableFeignClients和@FeignClient的解析和注册BeanDefinition2、自动装配Feign客户端,获取配置的超时等信息3、请求的动态代理的创建和服务调用过程 Spring Cloud Feign源码分为三部分,之前三篇是对整个过程的细节的详细过程说明,过于笼统没有突出主线,现在对整个进行总结。1、@EnableFeignClients和@FeignClient的解析和注册BeanDefinition 在项目是添加@EnableF...

2020-10-13 17:43:53 15

原创 Spring Cloud Feign源码 - FeignClientFactoryBean - @FeignClient的代理创建和调用过程

目录1、动态代理的创建过程2、方法调用【动态代理的执行invoke过程】1、HystrixInvocationHandler#invoke2、SynchronousMethodHandler#invoke1、动态代理的创建过程 前面分析过@EnablefeignClient会引入FeignClientsRegistrar,将@FeignClient注解的类以FeignClientFactoryBean的形式往BeanFactory注入BeanDefinition。Spring ..

2020-10-13 15:32:01 37

原创 Spring Cloud Feign源码-FeignRibbonClientAutoConfiguration自动装配

目录FeignRibbonClientAutoConfiguration1、FeignHttpClientProperties加载配置项2、CachingSpringLoadBalancerFactory3、配置默认的@FeignClient的连接和调用超时时间Feign客户端实现1、HttpClientFeignLoadBalancedConfiguration2、OkHttpFeignLoadBalancedConfiguration3、DefaultFeignLoadB

2020-10-12 23:46:50 55

原创 Spring Cloud Feign源码-@EnableFeignClients解析注解并注册成BeanDefinition

目录FeignClientsRegistrar1、registerDefaultConfiguration2、registerFeignClientsregisterFeignClient 梳理完Spring、Spring Boot的源码,再梳理Spring Cloud的源码有比较深的理解,就在需要抓住主线,然后再慢慢展开。Feign主要需要关注两个方向:1、@EnableFeignClients,将@FeignClients的服务创建远程Http的代理对象,后续进行调用2..

2020-10-12 16:05:30 42 1

原创 并发编程模式 - TransmittableThreadLocal解决父线程与线程池的共享变量拷贝

InheritableThreadLocal虽然能解决父子线程中的对象拷贝问题,并且自己再重新childValue方法还可以实现深拷贝。但是大多数情况下我们是使用的自定义线程池,而不是方法执行过程中再去创建线程。还好阿里提供了TransmittableThreadLocal解决该问题,需要引入依赖包<dependency> <groupId>com.alibaba</groupId> <artifactId>transmittab...

2020-10-12 00:05:15 64

原创 并发编程模式 - InheritableThreadLocal源码解析

很多时候需要在父子线程中传递值,或者引用相同的参数,则可以使用InheritableThreadLocal进程处理。在理解完上一篇ThreadLocal之后,再看看InheritableThreadLocal的源码,比较简单:public class InheritableThreadLocal<T> extends ThreadLocal<T> { public InheritableThreadLocal() { } protecte...

2020-10-11 22:58:34 21

原创 并发编程模式 - ThreadLocal源码和图文分析

目录一、ThreadLocal结构和存取数据1、ThreadLocal#get2、ThreadLocal#set二、梳理存在的问题和解决ThreadLocal#remove 从一道面试题开始吧,ThreadLocal使用需要注意什么,或者有什么问题? 答:如果是在线程池中使用,会存在 1、内存泄漏2、脏数据 的问题 解决:try finally中调用 remove方法 慢慢从ThreadLocal的设计和源码开始分析,一...

2020-10-11 21:54:25 1178

原创 Java深度拷贝方式和性能对比

二、性能对比 创建一个50个字段的对象,并使用不同的深度拷贝方式,创建对象N多遍。@Data@NoArgsConstructor@AllArgsConstructorpublic class DeepCopyEntity implements Cloneable, Serializable { /** * 序列化标识 */ private static final long serialVersionUID...

2020-09-27 16:26:03 152

原创 Spring Cloud 序列化和反序列化过程定制(Jackson)

现在都是基于Spring Cloud Feign进行微服务的调用,并且序列化的过程都封装完成的。只是自己可以定制序列化的方式,但是为了调用的时候能方便的找到问题所在等,基本都会使用json(Jackson等)方式的序列化【虽然性能比较差】。但是最近在项目上使用的时候,自己的需求是根据不同的类型(或者枚举),入参和出参会传入不同的子类,但是在接口的定义上只能使用父类进行接收。当反序列化完成后,在Controller层拿到的数据就只有父类公共的字段,而子类特有的字段在序列化时直接进行丢弃了。 ...

2020-09-21 21:53:28 137

原创 Mybatis(二)、mybatis总配置文件

目录1、properties、priperties(属性)2、settings、setting(设置)1)、cacheEnabled(是否开启二级缓存,默认为true)2)、lazyLoadingEnabled(关联查询的延迟加载,默认为false)3)、defaultExecutorType(默认Executor类型)3、typeAliases(类型别名)4、typeHandlers(类型处理器)5、objectFactory(Object生成工厂)6、plugins、

2020-07-14 21:57:11 101

Jenkins的rpm包

jenkins的rpm包,用于centos下安装jenkins。jenkins的rpm包,用于centos下安装jenkins。

2018-06-26

springboot swagger2 demo

OpenAPI 规范3 , springboot swagger2 demo ,主要是方便自己后面使用。

2017-12-17

gradle—gradle

gradle-1.6-bin

2017-09-20

gui-反编译

反编译

2017-08-02

renren-generator

renren-generator快速开发平台

2017-07-10

renren-fastplus

renren-fastplus快速开发平台

2017-07-10

renren-fast

**项目说明** - renren-fast是一个轻量级的Java快速开发平台,能快速开发项目并交付

2017-07-10

jeesite_hibernate

快熟开发java web项目

2017-06-13

jeesite_mybatis

快熟开发java web项目

2017-06-13

FileZilla工具

FileZilla

2017-06-12

Xshell工具

Xshell工具

2017-06-12

Xftp文件上传

Xftp

2017-06-12

firebug断点调试

断点调试

2017-05-23

eclipse的反编译插件

个人使用最好的反编译插件,就按照一般的eclipse插件进行安装即可

2017-05-14

Postman离线安装包

Postman离线安装包

2017-05-01

空空如也

空空如也

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

TA关注的人 TA的粉丝

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