Java源代码分析
文章平均质量分 55
Lucy_Leezhi
这个作者很懒,什么都没留下…
展开
-
Java ConcurrentHashMap 源码分析(2)
继续分析这个类的具体操作。上一次分析到这个类的操作实际上都是用的segment中的接口。先看put方法 final V put(K key, int hash, V value, boolean onlyIfAbsent) { HashEntry<K,V> node = tryLock() ? null : scanAndLockForPut(原创 2016-03-15 22:42:32 · 303 阅读 · 0 评论 -
ForkJoin源码分析之Task
上一次分析了ForkJoinPool构造时做了哪些工作,现在看一下这个框架的task是怎么玩的。task有一个顶层设计的接口就是ForkJoinTask,有两个类继承了这个接口,分别是RecursiveTask,RecursiveAction。区别就是一个任务有返回值一个任务没有返回值。看看两个task的定义:public abstract class RecursiveTask<V> extend原创 2016-04-05 22:30:12 · 1367 阅读 · 1 评论 -
Java ArrayList&Vector 源代码分析
ArrayList 对象继承了AbstractList对象,这就是说,ArrayList可以使用迭代器来操作,但是有一点要注意,上一次我们看AbstractList源代码时,知道这个迭代器是快速失败的,也就是说他记录了修改的次数,因此在实现这个ArrayList的添加操作时,我们也需要随时更新这个操作记录。也就是如下这个变量。protected transient int modCount = 0;原创 2016-03-13 09:53:36 · 418 阅读 · 0 评论 -
Quartz源码分析之HelloWorld示例
Quartz是一个定时任务执行的框架,其中组件众多,如果想知道其原理真不知道该怎么样开始,因此这里就先写一个示例,从这个示例我们挨个来分析其每个对象的作用,最后再来看各个组件的关系。 先写一个main类:package com.lenovo.bgjob;import java.util.Date;import org.quartz.JobBuilder;import org.quartz.Job原创 2016-03-23 22:15:35 · 312 阅读 · 0 评论 -
Quartz源码分析之Job
Quartz首当其冲就是Job类,这个接口主要描述了需要执行job的逻辑,所有的job都要实现Job接口。 Job接口定义如下:void execute(JobExecutionContext context) throws JobExecutionException;之所以定义一个execute方法来所有的job来实现,是因为这样可以被框架来统一调用。JobDetail接口,用于原创 2016-03-23 22:29:24 · 561 阅读 · 0 评论 -
Java HashMap&Hashtable 源代码分析
Java中List是使用数组来实现,这种实现方式有利于查找元素,但是在插入元素时非常复杂,因为需要移动其他元素,如果使用LinkList,这种方法查找很麻烦,需要遍历这个列表,但是插入却又很复杂。因此出现了HashMap的结构。这种结构使用LinkList来实现,但是定位下标时,用hash函数来实现,这样可以快速查找到需要的元素。还是从基本的字段看起。static final int DEFAULT原创 2016-03-13 15:10:29 · 295 阅读 · 0 评论 -
Quartz源码分析之Trigger
Trigger用于记录job的启动时间,失效日期,描述,是否删除等信息。我们使用的代码调用如下:Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger","group1").startAt(runTime).build();先看Trigger的定义:public enum TriggerState { NONE, NOR原创 2016-03-24 21:11:53 · 607 阅读 · 0 评论 -
Java ConcurrentHashMap 源代码分析
之前分析过HashMap,Hashtable的源代码,前者不支持多线程环境,但是如果使用了的话,在一定情况下会导致死锁,以后会分析。后者支持并发,但是每次只能有一个线程来操作。也就是说,这个锁是锁定了整个数组。 鉴于这种情况,Doug Lea 就想出了使用分段锁技术,网上也有一些资料叫做锁分离技术。 原理是这样的,先构造一个ConcurrentHashMap对象,这个对象中有很多个段对象(seg原创 2016-03-14 22:24:29 · 368 阅读 · 0 评论 -
ForkJoin 源码分析之ForkJoinPool的执行
之前说到ForkJoinPool的初始化,以及Task定义的方式,现在说说这个task是怎么启动的。从我们一般写代码的话,只会这样写一句:mainPool.invoke(task);就是调用了mainPool的invoke()方法,但是这个方法做了些什么呢?看如下代码: public <T> T invoke(ForkJoinTask<T> task) { Thread t = Th原创 2016-04-07 20:55:27 · 2843 阅读 · 0 评论 -
Java AbstractList 源代码分析
AbstractList是一个抽象容器,其中有很多abstract方法便于子类实现。这个类主要实现了迭代器功能和定义了一系列容器的操作接口。 迭代器是一个内部类,这个内部类有三个字段:int cursor = 0;int lastRet = -1;int expectedModCount = modCount;第一个可以理解为游标,用于标识数组元素的第一个下标。 第二个也可以理解为游标,但是原创 2016-03-12 10:51:29 · 930 阅读 · 0 评论 -
Java InputStream&FileInputStream 源代码分析
在java输入流中,InputStream是一个抽象接口,主要实现了read(byte b[],int off,int len)方法,这个方法的实现依赖于read()抽象方法,也就是说,read主要还是依赖于子类的实现。这个方法主要作用是从文件中读取字节数,将其放入到byte数组中。看一下这个方法的实现:public int read(byte b[], int off, int len) thro原创 2016-03-12 09:39:51 · 682 阅读 · 0 评论 -
ForkJoin 源码分析之ForkJoinPool
之前有学习过这个框架的使用,稍微回顾一下:初始化一个ForkJoinPool定义task或action使用pool来执行task或action这里初始化ForkJoinPool 采用如下方法:public final static ForkJoinPool mainPool = new ForkJoinPool();首先分析一下初始化做了些什么。public ForkJoinPool() {原创 2016-04-04 20:55:06 · 3251 阅读 · 0 评论 -
Java String 源代码分析
String类的字段主要有下面几个: final char value[], 字符数组主要用于存放字符 final int offset,字符数组的第一个元素下标 final int count,字符数组中元素的数量统计 int hash,字符串的hash值 构造函数如果我们平时这样定义数组,那么会得到一个空的字符数组,并且是不可变的。 String str = new String()原创 2016-03-03 22:00:28 · 323 阅读 · 0 评论 -
Java StringBuilder & StringBuffer 源代码分析
从资料来看都知道从操作效率比较的话,StringBuilder > StringBuffer >String. 原因是为什么呢? StringBuilder 不是线程安全的,StringBuffer 是线程安全的,String是不可变的,操作起来会创建新对象。 下面来看看源代码的分析, 首先StringBuffer和StringBuilder都继承自AbstractStringBuilder原创 2016-03-04 20:23:12 · 286 阅读 · 0 评论 -
Java File and FileSystem 源代码分析
Java File对象表示的是系统中一个文件或者文件夹,有几个关键字段:static private FileSystem fs = FileSystem.getFileSystem();private String path;public static final char separatorChar = fs.getSeparator();其中第一个字段是文件系统对象,表示操作系统的文件系统原创 2016-03-05 14:37:16 · 1156 阅读 · 0 评论 -
Java CopyOnWriteArrayList 源码分析
CopyOnWrite 的意思是写时拷贝,从网上的资料来看。看一下这个类的字段:域字段transient final ReentrantLock lock = new ReentrantLock();private volatile transient Object[] array;lock是对象锁,下面一个array是存放数据的数组。构造函数public CopyOnWriteArrayList原创 2016-03-17 22:18:08 · 291 阅读 · 0 评论 -
Java Timer&TimerTask源码分析
这个定时执行任务的类是个单线程的,具体使用可以参考之前的文章。现在看看实现原理。字段:private final TaskQueue queue = new TaskQueue();private final TimerThread thread = new TimerThread(queue);定义了一个TaskQueue.以及一个TimerThread. 这个TaskQueue是一个Timer原创 2016-03-19 15:20:13 · 491 阅读 · 0 评论 -
线程池源码分析以及原理
线程池的作用有如下两个:在多线程程序中,线程的创建和销毁有很高的代价,因此线程池来分担这一部分性能的损耗。就是说线程池使用场景之一就是当线程的创建和销毁所消耗的时间远大于线程执行任务所消耗的时间。在并发编程实践中提到,单线程程序的缺点就是串行执行效率低,单纯的多线程呢,没法管理多线程的数量。因此折中方式就是线程池了。换句话说,线程池可以广泛的使用在多线程程序中。线程池的原理是一个线程池对象管理原创 2016-03-20 17:30:59 · 418 阅读 · 0 评论 -
Java操作FTP(1)
这里记录一下java操作FTP的功能,包括上传/下载文件,文件夹,并发上传下载等,最后会分析Common-Net.jar包的内容。 先看一下常规的上传/下载文件操作的代码。package com.lenovo.plm.dms.ftp;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExc原创 2016-02-25 14:49:41 · 454 阅读 · 0 评论 -
Java操作FTP(2)
最近做一个数据迁移,数据存放在美国的一个FTP上,数据量在300G左右,文件在20万左右,需要下载到北京,使用FTP软件下载用户了一个星期才完成。因此想到用多线程来操作测试一下。思路如下:先用主线程统计出FTP上所有的文件夹,并将文件夹路径存放到一个list中。启动多个线程,读取list内容,分别登录FTP并下载。看service 类:package com.lenovo.plm.dms.ft原创 2016-02-25 17:07:01 · 457 阅读 · 0 评论 -
Quartz源码分析之Scheduler
Scheduler是Quartz框架中的调度器,主要负责调度job的执行,监控job的状态,添加删除job等,算是Quartz框架的核心。 Scheduler由Scheduler工厂获取,这个工厂又通过Scheduler仓库来获取具体的对象。工厂的具体实现是StdSchedulerFactory类,代码逻辑如下: 构造方法:public StdSchedulerFactory() {}构造方法是原创 2016-03-27 21:07:09 · 509 阅读 · 0 评论