自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 收藏
  • 关注

原创 ForkJoinPool核心数据结构和参数

ForkJoinPool类图ForkJoinWorkerThreadFactoryForkJoinWorkerThreadFactory是ForkJoinPool的内部接口,用于创建工作线程ForkJoinWorkerThread对象。 public static interface ForkJoinWorkerThreadFactory { /** * Returns a new worker thread operating in the given po

2020-12-02 11:22:33 93

原创 ForkJoinPool线程池描述

概述ForkJoinPool是JDK1.7加入的一个线程池类。Fork/Join技术是分治算法(Divide-and-Conquer)的并行实现,它是一项可以获得良好的并行性能的简单且高效的设计技术。目的是为了帮助我们更好的利用多处理器带来的好处,使用所有可用的运算能力来提升应用的性能。我们常用的数组工具类Arrays在JDK1.8之后添加的函数方式(如forEach等)也有运用。在整个JUC框架中,ForkJoinPool相对其他的类要复杂的多。在java.util.concurrent包中,Fork

2020-11-20 17:34:02 62

原创 线程池源码解析——submit方法源码解析

类图submit方法 /** * Runnable作为参数 */ public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Void> ftask = newTaskFor(task, null); execute(ftask); return

2020-11-17 23:17:30 45 1

原创 线程池源码解析——execute方法源码解析

execute源码 /** * 执行任务的方法 */ public void execute(Runnable command) { //如果command为空,将抛出NullPointerException if (command == null) throw new NullPointerException(); /* * 处理过程分为以下三个部分: * * 1. 如

2020-11-16 22:27:13 16

原创 线程池源码解析——线程池状态

线程池状态RUNNING:接收新的任务,执行阻塞队列中的任务。SHUTDOWN:不接受新任务,但是仍然可以处理阻塞队列中的任务。STOP:不接受新任务,不处理阻塞队列中的任务,中断正在处理的任务。TIDYING:所有任务终止,workerCount(工作线程数)等于0,进入TIDYING状态将会执行terminated()方法。TERMINATED:terminated()方法执行完成后进入TERMINATED状态。线程池状态转换如下:各运行状态的表示方式: // runStat

2020-11-16 17:05:40 14

原创 线程池源码解析——原理概述

corePoolSize核心线程线程池的基本大小,即在没有任务需要执行的时候线程的大小,并且只有在工作队列满了的情况下才会创建出超出这个数量的线程。核心线程是否会被回收?核心线程将一直保存在线程池中。哪怕核心线程是处于空闲状态,也可以不回收。allowCoreThreadTimeOut参数可以控制是否回收核心线程。在刚刚创建线程池的时候,核心线程并不会立刻启动,而是要等到有任务提交时才会启动。prestartCoreThread/prestartAllCoreThread方法可以事先启动核心

2020-11-16 15:16:30 17

原创 线程池源码解析——工作线程

ThreadPoolExecutor类图Worker类的声明private final class Worker extends AbstractQueuedSynchronizer implements Runnable线程池中的工作线程是通过内部类Worker表示的。Worker继承自AbstractQueueSynchronizer,可以实现同步器的功能;同是实现了Runable接口,因此Worker是可以当做线程使用的。Worker源码分析 pri

2020-11-16 11:06:30 4

原创 原子类(二)——ABA问题

什么是CASCAS:Compare and Swap,即比较再交换。CAS是一种无锁算法,CAS有三个操作数:内存值V旧的预期值A要修改的新值B当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。ABA问题的产生在CAS算法中,需要取出内存中某时刻的数据,在下一刻比较并替换。这个时间差中,会导致数据的变化。假如以下事件顺序:线程A:从内存位置V中取出status=A;线程B:从内存位置V中取出status=A;线程A:进行一些操作,将改为status=B;线

2020-11-13 16:39:11 20

原创 原子类(一)——AtomicInteger

原子操作原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。原子类在Java中提供了很多原子类,主要把这些原子类分成以下几大类原子更新基本类型或引用类型AtomicBoolean原子更新布尔类型,内部使用int类型的value存储1和0表示true和false,底层也是对int类型的原子操

2020-11-12 23:21:29 34

原创 Unsafe

概述Java和C++的一个重要区别就是Java中我们无法直接操纵一块内存区域,不能像C++中那样我们可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名为sun.misc.Unsafe,从名字就能看出来这个类对普通程序员来说是“危险的”,一般应用开发者不会用到这个类。Unsafe构造器Unsafe类是“final”的,不允许继承。且构造函数是private的。因此我们无法在外部对Unsafe进行实例化。public final c

2020-11-12 22:14:47 15

原创 JDK1.8 ConcurrentHashMap源码解析

哈希桶数组/** * The array of bins. Lazily initialized upon first insertion. * Size is always a power of two. Accessed directly by iterators. */ transient volatile Node<K,V>[] table;内部类NodeNode是ConcurrentHashMap存储结构的基本单元,继承于HashMap中

2020-11-12 16:36:40 48

原创 JDK1.7 ConcurrentHashMap源码解析

概述HashMap是非线程安全的,而HashTable是线程安全的,但是HashTable实现同步的方法比较暴力,即在所有的方法体上添加synchronized关键字,相当于所有读写线程均去读取一把锁,从并发角度,HashTable其实无法满足较高的并发度。另一种同步Map的方法是使用Collections工具类。 public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { return

2020-11-11 20:14:16 523 1

原创 Java8 HashMap

预备知识数组采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过指定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可以采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)。链表对于链表的新增、删除等操作(在找到指定操作位置后),仅处理节点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行对比,复杂度为O(n

2020-11-09 10:59:58 15

原创 Java7 HashMap

Java7 HashMap结构HashMap里面是一个数组,然后数组中每个元素是一个单向链表。上图中,每个绿色的实体是嵌套类Entry的实例,Entry包含四个属性:key,value,hash值和用于单向链表的next。capacity:当前数组容量,始终保持2^n,可以扩容,扩容后数组大小为当前的2倍。loadFactor:负载因子,默认为0.75.threShold:扩容的阈值,等于capacity*loadFactor。Java7 HashMap put() public V p

2020-11-08 21:29:00 7

原创 CopyOnWriteArrayList

用法示例import java.util.Iterator;import java.util.concurrent.CopyOnWriteArrayList;/** * @author admin */public class CopyOnWtiteArrayListDemo { public static void main(String[] args) throws InterruptedException { CopyOnWriteArrayList<Int

2020-11-08 20:10:57 26

原创 LinkedBlockingQueue

概述LinkedBlockingDeque是基于链表实现的阻塞队列。LinkedBlockingDeque是基于独占锁实现的阻塞队列。LinkedBlockingQueue声明public class LinkedBlockingDeque<E> extends AbstractQueue<E> implements BlockingDeque<E>, java.io.SerializableLinkedBlockingDeque类图如下:内

2020-11-08 00:58:55 4

原创 DelayQueue

概述DelayQueue是一个支持时延获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。DelayQueue可以运用在以下两个应用场景:缓存系统的设计:使用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,就表示有缓存到期了。定时任务调度:使用DelayQueue保存当天要执行的任

2020-11-07 23:53:11 31

原创 ArrayBlockingQueue

概述ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。线程安全是指,ArrayBlockingQueue内部通过互斥锁保护竞争资源,实现了多线程对竞争资源的互斥访问。有界是指,ArrayBlockingQueue对应的数组是有界限的。阻塞队列是指,多线程访问竞争资源时,当竞争资源已被某线程获取时,其他要获取该资源的线程需要阻塞等待;而且ArrayBlockingQueue是按FIFO(先进先出)原则对元素进行排序,元素都是从尾部插入到队列,从头部开始返回。ArrayB

2020-11-05 22:31:48 53

原创 Spring启动流程(十二)——完成刷新

protected void finishRefresh() { // 为上下文初始化生命周期处理器 initLifecycleProcessor(); // 将刷新事件传播到生命周期处理器 getLifecycleProcessor().onRefresh(); // 发布刷新完毕事件到对应的监听器 publishEvent(new ContextRefreshedEvent(this)); // 注册Mbean LiveBeansVi

2020-11-02 15:13:18 53 1

原创 Spring启动流程(十一)——完成初始化

// 完成Context的BeanFactory初始化,并完成所有剩余的单例Bean的初始化protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // 为context上下文初始化conversion service if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&

2020-11-02 14:52:48 17

原创 Spring启动流程(十)——注册事件监听

protected void registerListeners() { // 注册静态指定的监听器 for (ApplicationListener<?> listener : getApplicationListeners()) { getApplicationEventMulticaster().addApplicationListener(listener); } // 从BeanFactory中获取listener的名称,并注册

2020-11-02 14:49:58 73

原创 Spring启动流程(九)——初始化主题

protected void onRefresh() throws BeansException { // For subclasses: do nothing by default.}SpringMVC框架主题可以设置应用程序的整体外观,从而增强用户体验。主题是静态资源的集合,通常有css样式表和图片构成,这些css样式和图片会直接影响应用程序的视觉样式。要在Web应用中使用主题,必须实现ThemeSource接口,WebApplicationContext接口就扩展了ThemeSourc

2020-11-02 14:32:38 94 1

原创 Spring启动流程(八)——初始化事件广播

protected void initApplicationEventMulticaster() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); // 检查配置中是否有applicationEventMulticaster的Bean定义 if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {

2020-11-02 14:03:58 15

原创 Spring启动流程(七)——初始化消息源

Spring中定义一个MessageSource接口,以用于支持信息的国际化和包含参数的信息的替换。ApplicationContext接口扩展了MessageSource接口,因而提供了消息处理的功能(i18n或者国际化)。与HierarchicalMessageSource一起使用,还能够处理嵌套的消息,这些是Spring提供的处理消息的基本接口。public interface MessageSource { // 用来从MessageSource获取消息的基本方法。如果在指定的locale

2020-11-01 22:17:39 14

原创 Spring启动流程(六)——注册后处理器

// 实例化并且注册所有BeanPostProcessorsprotected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);}BeanPostProcessorBeanPostProcessor是Spring的Bean工

2020-11-01 22:09:23 25

原创 Spring启动流程(五)——调用后处理器

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); // Detect a LoadTimeWeaver and prepare fo

2020-10-30 21:44:13 46

原创 Spring启动流程(四)——BeanFactory后处理

protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { // ServletContextAwareProcessor中拿到应用上下文持有的servletContext引用和servletConfig引用 // 添加ServletContextAwareProcessor后处理器 beanFactory.addBeanPostProcessor(new ServletCo

2020-10-30 20:49:54 15

原创 Spring启动流程(三)——准备BeanFactory

这个阶段主要是当Spring获取了BeanFactory之后,还要做些处理工作(配置工厂的上下文),如:上下文的ClassLoader和BeanPostProcessor。protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 内部BeanFactory使用Context上下文的类加载器 beanFactory.setBeanClassLoader(getClassLoader(

2020-10-30 10:29:23 25

原创 Spring启动流程(二)——获取BeanFactory

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (logger.isDebugEnabled()) { logger.debug("Bean factory for " + getDisplayName(

2020-10-29 21:24:25 66

原创 Spring启动流程(一)——准备刷新

protected void prepareRefresh() { // 设置启动时间。当前毫秒数代表当前applicationContext的创建时间 this.startupDate = System.currentTimeMillis(); // 设置容器关闭标志 this.closed.set(false); // 设置启动标志 this.active.set(true); if (logger.isInfoEnabled()) { .

2020-10-29 13:29:20 109 2

原创 Spring启动流程概述

Spring的IoC容器在实现控制反转和依赖注入的过程中,可以划分为两个阶段:容器启动阶段Bean实例化阶段容器初始化加载配置分析配置信息将Bean信息装配到BeanDefinition将Bean信息注册到相应的BeanDefinitionRegistry其他后续处理容器实例化根据策略实例化对象装配依赖Bean初始化前处理对象初始化对象其他处理注册回调接口启动流程源码概览ClassPathXmlApplicationContextpublic ClassPa

2020-10-29 11:13:12 24

原创 路径解析和占位符

配置文件路径解析当执行Spring应用程序的时候,首先遇见的就是路径解析问题。关键代码如下:// 设置xml配置文件路径public void setConfigLocations(String... locations) { if (locations != null) { Assert.noNullElements(locations, "Config locations must not be null"); this.configLocations =

2020-10-28 14:20:40 46

原创 Spring容器核心类

BeanFactoryBeanFactory为Spring的IoC容器提供了基础功能。它主要被用于与Spring其他部分以及相关的第三方框架集成,并且它的子类实现DefaultListableBeanFactory是更高级别的GenericApplicationContext容器中的关键委托。Spring Bean的创建是典型的工厂模式,这一系列的Bean工厂(即IoC容器)为开发者管理对象的依赖关系提供了很多便利,在Spring中有许多的IoC容器实现供用户选择和使用,其相互关系如下:Defaul

2020-10-28 13:49:35 13

原创 认识Spring IOC容器

什么是Spring IoC容器Spring Ioc容器的最主要作用就是:完成对象的创建管理和依赖注入等 。什么是IoCIoC(Inversion of Control,控制反转)是Spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由Spring来负责控制对象的生命周期和对象之间的关系。既然提到了IoC,我们就不得不提及设计模式中的六大原则。因为原则之一的“依赖倒置”跟IoC有很大的关系。控制反转(IoC)是DIP(Dependence Inversion Principle,

2020-10-26 22:29:47 17

原创 Spring源码环境准备

安装配置Gradle下载GradleSpring是基于Gradle构建的,所以本地需安装Gradle。Gradle是一个基于Groovy的构建工具,它使用Groovy来编写构建脚本,类似Maven支持依赖和多项目构建,但比Maven更加简单轻便。你可以到Gradle官方网站下载。地址:https://gradle.org/releases/配置Gradle环境下载Gradle后解压到你的目录 。如:D:/Develop/Gradle-5.6.2设置环境变量# 以windows为例GRA

2020-10-21 22:10:31 22

原创 Spring简介及历史

Spring简介Spring 在起源可以追溯到 Rod Johnson 于2002年出版的《Expert One-to-One J2EE Design and Development》一书 。在这本书中,Rod 展示了他的 interface21 框架,他为自己的应用编写了这一框架。这一框架被发布到开源世界后,组成了现在我们所知的 Spring 框架的基础。Spring 在早期的 beta 和发布备选版本阶段进行得很迅速,第一个正式版本 1.0 在 2004 年 3 月 24 日 发布。Spring 是

2020-10-21 21:41:48 72

原创 Netty高性能

Netty高性能同步非阻塞通信模型在IO编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者IO多路复用技术进行处理。IO多路复用技术通过把多个IO的阻塞复用到同一个Selector的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型相比,IO多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源。Netty的IO线程NioEventLoop由于聚合了多路复

2020-09-24 23:18:56 21

原创 源码分析与序列化

Netty源码分析Netty中几个重要组件AbstractBootStrap:启动辅助类EventLoop:事件处理线程ChannelHandler:处理器AbstractChannel:通道ChannelPipeline:管道Unsafe:与Nio交互的媒介ServerBootstrap

2020-09-24 22:53:53 29

原创 Netty入门

NIO的三个重要组件Channel传统IO操作对read()或write()方法的调用,可能会因为没有数据可读/可写而阻塞,直到有数据响应。也就是说读写数据的IO调用,可能会无限期的阻塞等待,效率依赖网络传输的速度。最重要的是在调用一个方法前,无法知道是否会被阻塞。NIO的Channel抽象了一个重要特征就是可以通过配置它的阻塞行为,来实现非阻塞式的通道。Channel是一个双向通道,与传统IO操作只允许单向的读写不同的是,NIO的Channel允许在一个通道上进行读和写的操作。几个常用的Chan

2020-08-11 15:55:49 45

原创 NIO基础篇

阻塞非阻塞与同步异步内核态首先理解用户空间与内核空间的数据交互过程。阻塞与非阻塞阻塞与非阻塞是描述进程在访问某个资源时,数据是否准备就绪的的一种处理方式。当数据没有准备就绪时:阻塞:线程持续等待资源中数据准备完成,直到返回响应结果。非阻塞:线程直接返回结果,不会持续等待 资源准备数据结束 后才响应结果。同步与异步同步与异步是指访问数据的机制,同步一般指主动请求并等待IO操作完成的方式。异步则指主动请求数据后便可以继续处理其它任务,随后等待IO操作完毕的通知。I/O模型简介传统BIO

2020-08-11 13:47:36 25

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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