ArrayList源码学习

前言

ArrayList是开发人员使用最为普遍的类。该类是一个可调整大小的List接口实现。该类实现了所有可选的列表操作,并允许存储包括 null 在内的所有元素。

每个ArrayList实例都有一个容量。 容量是用于存储列表中的元素的数组的大小。 它总是至少与列表大小一样大。 当元素被添加到ArrayList时,其容量会自动增长。

需要注意的是:ArrayList不是同步的,即非线程安全的的类

源码解析

Read More

java基础集合源码学习之AbstractList学习

前言

在日常编程中,ArrayList是使用最多的列表。在上篇文章 AbstractCollection学习 的学习中,我们可以从java基础集合框架图中得知:ArrayList继承了AbstractList,并实现了List接口。而其中 AbstractList 则继承了AbstractCollection

内部数据结构

数据结构
1
2
3
4
5
6
7
8
9
10
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {

// ArrayList集合的修改次数
protected transient int modCount = 0;

//迭代器类
private class Itr implements Iterator<E> {}

private class ListItr extends Itr implements ListIterator<E> {}
}

AbstractList继承了AbstractCollection抽象类,并实现了List接口。关于AbstractCollection已在另篇文章讲解。关于List接口,在下文有简述。AbstractList中唯一的一个属性为modCount,表示集合被修改的次数。在AbstractList的子类中,凡是涉及到修改列表的内部数据结构的方法,都是修改modCount的值。

List 源码分析

Read More

java基础集合源码学习之AbstractCollection学习

前言

Java集合框架是指java的集合类。Collection 接口是一组允许重复的对象。Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。 List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。

java基础集合框架图

java基础集合框架

从上面的集合类继承图可以看出,集合类主要分为两大类:Collection和Map。

Collection 接口

Read More

Executor框架源码学习

前言

在Java中,使用线程来异步执行任务。但是Java线程的创建与销毁需要一定的开销,因此我们可能会考虑使用线程池来复用线程以达到较高的性能。使用线程池的好处

  1. 降低资源消耗。
  2. 提高响应速度。
  3. 提高线程的可管理性。

由于线程池的以上好处,JDK1.5中的Executors框架就因此而问世。

Java线程既是工作单元,也是执行单元。从JDK1.5开始,把工作单元与执行机制分离开来。工作单元包括Runnable 和 Callable,而执行机制由Executor框架提供。

Executors框架类结构图

Executors框架类图

简单使用

Read More

Linux系统dokuwiki部署

前提

DokuWiki是一个开源wiki引擎程序,运行于PHP环境下。所以在部署安装DokuWiki之前,需要确认待部署的机器上已有PHP环境。

dokuwiki项目部署
  1. 在官网下载dokuwiki包,并解压
1
2
3
4
5
//包下载
wget -c http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz

//解压。解压后将解压后的包放在目录/var/www/下,并把包命名dokuwiki。在部署Nginx时,需要用到该目录。如需修改,则需要修改Nginx配置及执行run.sh 的参数。
tar -zvxf dokuwiki-stable.tgz
  1. 变更权限

Read More

Fork/Join框架源码学习之ForkJoinPool学习

前言

    在 Fork/Join框架源码学习之ForkJoinTask学习 文章中,我们已经初步分析了Fork/Join框架中的一个重要类 ForkJoinTask类。在本篇文章中,我们分析一下Fork/Join框架中的另一个重要类:ForkJoinPool

    在ForkJoinPool的介绍中有说:ForkJoinPool是一种用于运行ForkJoinTasks的ExecutorService(An ExecutorService for running ForkJoinTasks)。即ForkJoinPool也是一种ExecutorService。但由于工作窃取(work-stealing)的缘故,该类与其他ExecutorService又不太一样。

    创建ForkJoinPool对象的方式有多种,在后面的分析中,可以看到该类有多个重载的构造函数。但是在官方文档中,比较推荐使用静态方法 commonPool() 创建ForkJoinPool对象。

1
2
3
4
5
6
官方文档描述:

A static commonPool() is available and appropriate for most applications.
The common pool is used by any ForkJoinTask that is not explicitly
submitted to a specified pool. Using the common pool normally reduces resource
usage (its threads are slowly reclaimed during periods of non-use, and reinstated upon subsequent use).

源码分析

Read More

Fork/Join框架源码学习之ForkJoinTask学习

前言

Fork/Join框架是一个用于并行执行任务的框架,核心是:把一个大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果。体现了分而治之的思想。类似于算法中的归并排序。该框架之所以有更好的并发性能,是因为其充分利用了所有线程的工作能力,避免空闲线程,充分发挥多核并行的处理能力。

image

使用

预备知识点

在java的官方文档介绍Fork/Join中,可以知道Fork/Join框架的基本使用的伪代码为:

Read More

SynchronousQueue源码解析

前言

SynchronousQueue是BlockingQueue阻塞队列的一种实现。但是作为阻塞队列的一种,SynchronousQueue与其他BlockingQueue有着不同特性:

  1. SynchronousQueue没有容量(A synchronous queue does not have any internal capacity, not even a capacity of one.)。所以其内部方法:isEmptysizeclearcontainsremove都是默认实现。
  2. SynchronousQueue分为公平(队列实现)和非公平(栈实现)策略。默认情况下采用非公平性访问策略。

数据结构

Read More

Fork me on GitHub