自定义博客皮肤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)
  • 收藏
  • 关注

原创 JDK1.8源码分析:ForkJoin任务递归分解与并行计算框架的设计与用法

概述ForkJoin框架是在JDK1.7推出的,支持将一个大任务递归拆分成多个小任务,然后交给线程池的线程执行任务的并行处理,最后可以获取所有这些任务的执行结果并汇总。这个框架的主要设计目的就是实现任务的自动化递归拆分,然后交给线程池的线程处理,而不需要在应用代码中实现任务的递归拆分和汇总,简化了多线程环境下,递归拆解任务进行并行执行的编程难度。简单来说就是对递归算法的多线程实现,即支持每个...

2019-02-17 17:53:59 5308

原创 JDK1.8源码分析:ConcurrentSkipListMap-有序并发容器Map

TreeMap,ConcurrentSkipListMap和ConcurrentSkipListSet在集合框架中提供了TreeMap来实现Map的key有序,TreeMap不是线程安全的,如果多个线程对TreeMap进行结构性修改,如添加或删除操作,则需要进行同步。而在JUC包中提供了ConcurrentSkipListMap来实现一个并发、线程安全版本的TreeMap。TreeMap是基...

2019-02-16 23:36:57 7290 1

原创 JDK1.8源码分析:线程安全的CopyOnWriteArrayList与CopyOnWriteArraySet

概述ArrayList不是线程安全的,所以如果需要保证ArrayList在多线程环境下的线程安全,即保证读的线程可见性和写的数据一致性,可以使用synchronized或者ReentrantLock对ArrayList的读写进行同步,或者使用Collections.syncrhonizedList来保证成同步SynchronizedList。由于以上方法对读写都需要加锁,一定程度上影响了读写...

2019-02-16 18:21:29 5784

原创 JDK1.8源码分析:ScheduledExecutorService和周期性任务停止执行的原因

概述ScheduledExecutorService继承于ExecutorService,主要提供任务的延迟和周期性执行的功能。其主要提供了schedule,scheduleAtFixedRate,scheduleWithFixedDelay三个方法,分别用于延迟执行任务,特定频率周期性执行任务,特定延迟周期性执行任务。public interface ScheduledExecutorS...

2019-02-16 15:09:58 6558

原创 JDK1.8源码分析:Executors线程池创建工厂的用法和实现原理

概述在Executor线程执行器框架中,提供了Executors这个工具类来创建指定的Executor实现类。在Executors工具类中提供了ThreadPoolExecutor创建时所需的默认参数,通过方法名称来表明指定的实现,从而简化了ThreadPoolExecutor的创建。固定线程池,无界队列线程池的核心线程数和最大线程数固定且相同,任务等待队列无界:public st...

2019-02-16 12:37:30 6196

原创 JDK1.8源码分析:Future和FutureTask-任务异步执行结果

概述任务在Executor线程执行器当中是异步执行的,而有些任务是需要返回执行结果的,故在Executor派生接口ExecutorService接口中定义了带返回结果的提交方法submit,其中返回结果为Future接口的对象。Future接口主要提供了异步返回任务执行结果,取消任务执行,获取任务执行状态的功能,接口定义如下:public interface Future<V&...

2019-02-16 11:09:27 5311

原创 JDK1.8源码分析:Executor和ThreadPoolExecutor线程池的设计和源码实现

概述Executor线程执行器框架是在jDK1.5提供的,设计的主要目的是实现Runnable任务的提交和执行分离:任务提交主要是指在应用代码中实现Runnable接口定义业务相关的一个任务,然后交给一个Thread线程对象来执行;任务的执行是指Thread线程执行该任务。有了Executor线程执行器之后,我们只需要实现Runnalbe接口定义自己的任务即可,不需要显示创建Thread对象来...

2019-02-16 00:27:52 4874 1

原创 JDK1.8源码分析:可重入锁ReentrantLock和Condition的实现原理

synchronized的用法和实现原理synchronized实现线程同步的用法和实现原理不足synchronized在线程同步的使用方面,优点是使用简单,可以自动加锁和解锁,但是也存在一些不足:synchronized是阻塞的,不支持非阻塞,中断和超时退出特性;synchronized是互斥锁,不支持多个线程对资源的共享访问,如多个读线程进行并发读;当多个方法共享多个mo...

2019-02-14 13:09:35 6525

原创 synchronized实现线程同步的用法和实现原理

作用和用法在多线程对共享资源进行并发访问方面,JDK提供了synchronized关键字来进行线程同步,实现多线程并发访问的线程安全。synchronized的作用主要体现在三个方面:(1)确保线程互斥地访问同步代码;(2)保证共享变量的线程可见性;(3)禁止指令重排。其中(2)和(3)相当于volatile关键字的作用。sychronized可以用在(1)静态方法,(2)普通成员方法...

2019-02-14 00:06:25 5761 1

原创 JUC并发包基于AQS实现的线程同步器的案例分析

以下是JUC并发包提供的基于AQS实现的线程同步器。ReentrantLock:可重入锁通常用于多线程操作进行同步,实现线程安全。存在公平和非公平两种实现,默认为非公平。如在LinkedBlockingQueue中使用putLock来同步多个生产者的写操作,使用takeLock来同步多个消费者的读操作。public boolean offer(E e, long timeout, ...

2019-02-13 18:33:10 5687

原创 JDK1.8源码分析:ReentrantReadWriteLock可重入读写锁

概述ReentrantReadWriteLock包含读写两把锁,如下:public ReentrantReadWriteLock.WriteLock writeLock() { return writerLock; }public ReentrantReadWriteLock.ReadLock readLock() { return readerLock; }对同一线程而言,...

2019-02-13 15:59:57 4918

原创 JDK1.8源码分析:基于队列的线程同步器AbstractQueuedSynchronizer(AQS)

概述AQS是一个实现线程同步器的基础框架,线程同步器的作用是协调多个线程对共享资源的访问,如ReentrantLock,在多个线程共享同一个资源时,实现多线程对该共享资源的同步访问,避免并发访问导致数据不一致等问题。或者协调多个线程之间的操作,如CountDownLatch。AQS提供了基于一个FIFO队列实现线程同步器的基础设施,具体的线程同步器实现类,只需要关注对共享资源的访问控制,即是...

2019-02-13 00:18:42 5002

原创 JDK1.8源码分析:阻塞队列LinkedBlockingQueue与BlockingDeque(双端)的设计与实现

概述BlockingQueue:阻塞FIFO队列,在接口设计层面,对于从队列尾部添加元素,从队列头部获取并删除元素的方法,在队列满时添加元素或者队列空时获取元素,则提供了四个版本:分别是:抛异常,直接返回一个特殊值null或者false,无限阻塞直到队列不满或者队列不空,阻塞指定的时间。实现类包括:ArrayBlockingQueue(基于数组),LinkedBlockingQueue(基于...

2019-02-11 18:19:46 5033

原创 JDK1.8源码分析:LinkedList

接口和数据结构LinkedList,实现了List和Deque接口,其中Deque是双向队列,即可以在队列头部和尾部进行插入或删除数据节点。LinkedList也不是线程安全的。public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, ...

2019-02-11 12:52:52 4640

原创 JDK1.8源码分析:ArrayList

ArrayList相对于数组Array只是提供了动态拓容的功能,在内部也是使用一个数组来存储数据的。ArrayList也不是线程安全的,如果需要线程安全,则需要使用Collections.synchronziedList来进行包装,如:List list = Collections.synchronizedList(new ArrayList(…));/** * Default in...

2019-02-11 10:59:16 4765 2

原创 JDK1.8源码分析:HashSet与LinkedHashSet

HashSet内部封装了一个HashMap,利用HashMap的key来存储Set的值,然后对应的value都是一个Object实例。从而利用HashMap的key的唯一性来实现去重。// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new ...

2019-02-09 21:00:49 4935

原创 JDK1.8源码分析:LinkedHashMap与LRU缓存设计思路

概述LinkedHashMap继承于HashMap,在HashMap的基础上,新增了两个特性:支持以节点的插入顺序来迭代该map内的所有节点,即内部维护;支持缓存设计中LRU的特性,即LinkedHashMap支持按访问顺序来排序节点,具体在内部实现了如果开启了这个特性,则每个通过get方法访问了一个节点,则该节点会被移动到内部的双向链表的末尾,故双向链表的头结点是最近最少访问的节点,...

2019-02-09 18:25:24 5236

原创 JDK源码分析:ConcurrentHashMap(JDK1.8版本)

概述在JDK1.7主要通过定义Segment分段锁来实现多个线程对ConcurrentHashMap的数据的并发读写操作。整个ConcurrentHashMap由多个Segment组成,每个Segment保存整个ConcurrentHashMap的一部分数据,Segment结合ReentrantLock,即Segment继承于ReentrantLock,来实现写互斥,读共享,具体为有多少个Se...

2019-02-09 01:14:52 5584 1

原创 JDK源码分析:ConcurrentHashMap(JDK1.7版本)

主文章:JDK源码分析:ConcurrentHashMap(JDK1.7和JDK1.8)与HashTableSegment:分段锁在HashMap中,是使用一个哈希表,即元素为链表结点Node组成的数组table,而在ConcurrentHashMap中是使用多个哈希表,具体为通过定义一个Segment来封装这个哈希表其中Segment继承于ReentrantLock,故自带lock的功...

2019-02-08 18:12:52 6031 1

原创 JDK源码分析:ConcurrentHashMap(JDK1.7和JDK1.8),HashTable与Collections.synchronizedMap

概述ConcurrentHashMap是线程安全的HashMap,提供与HashTable一样的线程安全特性。与HashMap不同的是,除了线程安全之外,HashMap的key和value都支持null,而HashTable和ConcurrentHashMap的key和value都不允许是null。与HashTable不同的是,ConcurrentHashMap不需要对所有需要线程安全保证...

2019-02-08 18:10:48 5148

原创 JDK1.8源码分析:HashMap

数据结构在JDK1.8之前,HashMap是基于链式哈希实现的,而在JDK1.8之后,为了提高冲突节点的访问性能,在链式哈希实现的基础上,在哈希表大小超过64时,针对冲突节点链条,如果节点数量超过8个,则升级为红黑树,小于等于6个时,则降级为链表结构。链式哈希链式哈希是一个数组结构,数组元素为链表或者红黑树。如下为HashMap的内部数据存储结构,也是链式哈希的实现。其中Node为一...

2019-02-07 12:41:36 5269

原创 Tomcat源码分析(五):Socket网络通信和线程模型体系结构设计

概述Tomcat在设计当中,自顶向下主要包括:Catalina容器,Coyte连接器和底层Socket通信端点EndPoint三部分组成。底层Socket通信端点EndPoint主要完成socket通信的相关细节和整个Tomcat框架线程模型的实现。服务启动:Tomcat启动时,从Catalina容器开始启动,往下依次创建和启动Coyote连接器,创建服务端监听请求socket和请求处理工作...

2019-02-05 23:13:45 4909

原创 SpringBoot学习(五):自动配置的源码实现(三)@Conditional条件化加载机制

概述由上篇文章:SpringBoot学习(五):自动配置的源码实现(二)Spring容器对自动配置的加载的分析可知,通过在应用主类中添加@SpringBootApplication或者@EnableAutoConfiguration注解,可以激活SpringBoot的自动配置机制,为应用提供一系列默认的功能组件,在应用中可以直接使用如@Autowired注解注入即可,而不需要在应用中显式配置...

2019-02-02 18:23:18 5276

原创 SpringBoot学习(五):自动配置的源码实现(二)Spring容器对自动配置的加载

概述这是 SpringBoot学习(五):自动配置的源码实现系列文章的第二篇,在第一篇文章:SpringBoot学习(五):自动配置的源码实现(一)@EnableAutoConfiguration详解中已经介绍过@EnableAutoConfiguration注解的设计,而Spring容器对自动化配置的加载是基于@EnableAutoConfiguration注解的这个设计来实现的,接下...

2019-02-02 11:53:56 4696

原创 SpringBoot学习(五):自动配置的源码实现(一)@EnableAutoConfiguration详解

这篇文章是 SpringBoot学习(五):自动配置的源码实现系列的第一篇。@EnableAutoConfiguration注解@EnableAutoConfiguration为@SpringBootApplication注解的其中一个注解,作用是激活SpringBoot的自动配置功能。注解的定义如下:可以看到包含@AutoConfigurationPackage注解,通过@Impo...

2019-02-01 12:01:27 4842

原创 SpringBoot学习(五):自动配置的源码实现

概述我们知道SpringBoot的一个很重要的特性就是,在pom.xml中添加相关start包配置,如spring-boot-starter-data-redis,则SpringBoot框架可以自动为应用配置对应的默认功能组件bean,如redisTemplate等,使得在应用代码直接使用即可,如直接使用@Autowired注入即可,而不需要跟之前的Spring项目一样,需要在XML文件或者在...

2019-02-01 12:00:16 4206

原创 SpringBoot学习(四):内嵌Servlet引擎(Tomcat,Jetty等)的实现原理

概述SpringBoot使用main方法启动的一个重要特性是,不需要打包成war部署到Tomcat这种Servlet容器中,而是只需打包成jar,然后通过java或mvn等命令运行这个jar包,然后应用就可以在指定的端口监听客户端的连接请求了。在SpringBoot内部主要是引用了embedded的Tomcat或Jetty等作为Servlet引擎,由该Servlet引擎负责接收Web请求并交...

2019-01-31 08:08:27 6235

原创 SpringBoot学习(三):Filter过滤器等的配置方法和SpringBoot源码实现原理

Servlet,Filter,Listener的注册在SpringBoot应用来说,由于是自身启动了一个Servlet引擎,并且需要创建一个与应用关联ServletContext对象绑定到Servlet引擎,从而使得Servlet引擎接收到请求可以分发到该应用来处理。ServletContext内部通常会包含Servlet规范中的Servlet,FFilter,Listener等组件,...

2019-01-30 18:19:09 5806

原创 @Configuration注解的类的加载(注意不是处理@Configuration注解处理)实现原理

概述这里主要分析@Configuration注解的类自身的加载的实现,即生成该类对应的BeanDefinition,注册到BeanFactory,此时该类就跟一个普通使用了如@Component注解的类一样,是在创建和初始化BeanFactory的过程中完成的。而@Configuration注解的处理是通过ConfigurationClassPostProcessor来完成的,Configur...

2019-01-29 10:17:40 12880 2

原创 SpringBoot学习(二):为什么main方法启动类SpringApplication需要在项目根目录

在基于SpringBoot的应用应用中,通常需要将包含main方法的启动类放在项目的根目录,即与所有包平级。原因主要是启动类自身是一个基于注解的配置类,一般使用@SpringBootApplication注解,而这个注解由三个注解组成,分别是:@SpringBootConfiguration,@ComonentScan,@EnableAutoConfiguration。@SpringBoo...

2019-01-29 10:06:24 11626

原创 基于注解@EnableWebMvc启用SpringMvc的用法与实现原理

用法与最佳实践在@Configuration注解的配置类中添加,用于为该应用添加SpringMVC的功能,即添加之后可以在项目中,可以使用@RequestMapping,@Controller等注解来定义请求处理与请求uri的映射和其他SpringMvc提供的功能。使用方法如下:@Configuration@EnableWebMvc@ComponentScan(basePackageCla...

2019-01-28 15:32:30 11047 2

原创 Spring源码分析:applicationContext.xml文件解析与NamespaceHandler

概述Spring容器启动,在创建BeanFactory时,需要加载和解析当前ApplicationContext对应的配置文件applicationContext.xml,从而获取bean相关的配置信息。在内部实现的调用关系为:ApplicationContext通过XmlBeanDefinitionReader来完成从applicationContext.xml获取应用配置的bean信息,...

2019-01-28 12:14:58 5736

原创 SpringBoot学习(一):SpringApplication的用法与内部源码实现原理

概述在基于SpringBoot的web应用中,通常使用一个带有main方法的类,通过命令行执行main方法来启动整个应用。而在main方法中是使用SpringApplication.run这个静态方法或者创建SpringApplication对象,执行成员方法run,以该main方法所在的类作为参数的方式启动的。main方法所在的类是一个基于Spring的注解,如@Configuration...

2019-01-28 10:16:45 5538

原创 Spring IOC源码分析(六):BeanFactory体系结构与IOC容器的核心组件分析

一. 概述Spring容器通常指定的ApplicationContext的体系结构设计,即整个Spring框架的IOC功能,是通过ApplicationContext接口实现类来提供给应用程序使用的。应用程序通过ApplicationContext提供方法来间接与内部Bean工厂交互,如获取Bean对象实例等。在Spring框架内部设计当中,ApplicationContext是Spring...

2019-01-27 16:04:24 6308

原创 Spring基于@Configuration的类配置的内部源码实现

概述Spring容器启动时,即执行refresh方法时,主要是通过执行ConfigurationClassPostProcessor这个BeanFactoryPostProcessor,来开启整个@Configuration注解的系列类的加载的,即开启基于@Configuration的类配置代替beans标签的容器配置的相关bean的加载。而ConfigurationClassPostPro...

2019-01-27 09:07:42 6072

原创 Spring Bean对象初始化和销毁相关回调的用法和源码实现

XML配置或者@Bean注解构造后置处理:在bean标签的init-method中指定处理方法;或者使用@Bean注解的initMethod指定,其中@Bean通常为@Configuration(或者是@Component或@Component的子注解,如@Service,@Configuration是@Component的一个子注解)注解里面的@Bean方法;销毁前置处理:在bean标签的...

2019-01-26 15:02:23 5969

原创 Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理

注入实现方式@Autowired主要可以在set方法,field,构造函数中完成bean注入,注入方式为byType的,如果存在多个同一类型的bean,则使用@Qualifier来指定注入哪个beanName的bean。与JDK的@Resource的区别:@Resource是基于beanName来查找bean注入的,而@Autowried是基于类型来查找bean注入的。与JDK的@Inje...

2019-01-26 12:06:46 7207

原创 Spring基于@Configuration的类配置的用法

使用@Configuration来注解里面包含多个@Bean注解的方法的类。这些使用@Bean注解的方法,会被加载为BeanFactory里面的BeanDefinition,其中beanName默认为方法名。其实就相当于一个xml配置文件的beans标签。生效方式使用AnnotationConfigApplicationContext,在refresh之前,通过AnnotationC...

2019-01-25 18:34:13 11626

原创 Spring MVC源码分析(三):请求分发器DispatcherServlet的设计与实现

概述

2019-01-22 17:29:01 9025 1

原创 Spring IOC源码分析(五):IOC的容器上下文ApplicationContext的自顶向下分析

ApplicationContext接口:最底层接口,通过继承BeanFactory接口的方法,定义了与BeanFactory的关联绑定,以及其他功能组件,如Environment,MessageSource等的关联。public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, Hie...

2019-01-22 17:12:31 7528

空空如也

空空如也

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

TA关注的人

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