spring模块解读

spring模块

Spring框架的功能被有组织的分散到约20个模块中。这些模块分布在核心容器,数据访问/集成,Web,AOP(面向切面​​的编程),植入(Instrumentation),消息传输和测试,如下面的图所示。

查看更多

BST树与AVL树

抽象树结构定义

本文将介绍BST树与AVL树,树的数据结构是类似于链表,首先我们需要一个抽象类AbstractTree,该类里面定义了树节点的数据结构,以及完成树的先序、中序、后续遍历的代码模板,后面的BST与AVL树将继承这个抽象类;

首先我们定义树节点的数据结构,通过内部类定义:

查看更多

Java并发之线程池源码分析

为什么需要线程池

操作系统中线程的实现有三种,一种是用户级线程,一种是内核支持线程,还有一种是前两种的组合方式。用户级线程是在用户空间实现的,而内核级线程是在OS内核空间实现的。JVM对于线程并没有明确的定义是用户线程还是内核线程,但Java常用的JVM HotSpot,它都是使用1:1线程模型即内核线程,线程的调度完全交给了操作系统内核;所以在HotSpot上创建线程需要操作系统从用户态切换到内核态,这个开销是巨大的。而Java的线程在使用完后就会被回收,而需要时又会被创建,所以通过将空闲线程管理起来成为线程池,当需要线程运行任务的时候就从线程池中拿线程,避免了线程的创建过程,提升效率。

查看更多

Java并发之ThreadLocal源码分析

ThreadLocal介绍

ThreadLocal是Java提供的一个线程局部变量的工具,虽说它是为线程服务,但是它并没有在Java的并发包里面,而是和Thread一样在java.lang包里,首先我们来看下ThreadLocal的基本用法。

一般情况下,我们需要一个成员变量,并且在线程里对成员变量修改,往往我们会这样写:

查看更多

Java并发之原子类源码分析(以AtomicInteger为例)

什么是原子类

在我之前的博客文章中介绍了JVM的内存模型,JVM内存模型规定了对一个变量的操作分为八步,这八步分别是:Lock(锁定)、unlock(解锁)、read(读取)、load(载入)、use(使用)、assign(赋值)、store(存储)、write(写入);也就是说,对于一个数的操作是分为八步完成的,即对一个数的操作不是一个原子操作,如:i++,在代码层面就一行代码,看似是原子操作,实际上在指令层面并不是一步完成的,而是多部完成的。这就造成了对于变量操作的线程安全问题。

查看更多

Java并发之ReentrantReadWriteLock源码分析

ReadWriteLock

ReadWriteLock是一个读写锁接口,所谓读写锁,是对访问资源共享锁和互斥锁,一般的重入性语义为如果对资源加了写锁,其他线程无法再获得写锁与读锁,但是持有写锁的线程,可以对资源加读锁(锁降级);如果一个线程对资源加了读锁,其他线程可以继续加读锁。

查看更多