JDK动态代理的实现

什么是动态代理

问题引入

有这样一个类:

1
2
3
4
5
6
7
public class Hello {

public void say() {
System.out.println("hello world");
}

}

现在有一个需求:需要在Hello类运行say()方法前后使用日志记录下运行的时间戳,该怎么做?

查看更多

Java容器源码分析之HashMap与HashSet

HashMap与HashSet介绍

HashMap是Java为我们提供的一个存放键值对的容器,通过键的hash值定位存储位置,具有很快的访问速度。但是其遍历顺序是不确定的,这里所说的不确定是指其遍历的顺序与放入顺序不一致、多次遍历输出顺序不一致(可能会放进数据导致reHash,改变原有顺序)。HashMap允许有一个null的键,对于值没做要求。HashMap也是个非线程安全的容器,在并发环境下可以使用ynchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。

HashSet是Java为我们提供的一个集合类容器,他不允许容器内元素重复,底层采用HashMap实现(适配器模式)。

查看更多

Java容器源码分析之LinkedList

LinkedList简介

LinkedList是一个使用双向链表结构实现的容器,与ArrayList一样,它能动态扩充其长度,LinkedList相较于ArrayList,其任意位置插入速度比ArrayList要快,但是其查询速度要比ArrayList要慢;LinkedList继承自AbstractSequentialList,实现了List、Deque、Cloneable、Serializable接口。

查看更多

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的基本用法。

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

查看更多