Java SE常用类源码解析(JDK1.8)
文章平均质量分 93
主要分析java.lang,java.util,java.io,java.nio下的常用类,不定期更新。
博主是一名17级CS专业在校学生,技术水平有限,有不对的地方欢迎交流讨论
A__Plus
这个作者很懒,什么都没留下…
展开
-
Java并发工具包中的Fork/Join框架解析(JDK1.8)
一、引言ForkJoinTask是Java并发工具包中的工具类,自JDK1.7被引入。它可以将一个大任务拆分成很多小任务来异步执行,最后合并计算结果作为任务执行的结果返回给调用者。ForkJoinPool继承关系图:ForkJoinTask在Java并发工具包中还有两个子类:RecursiveTask和RecursiveAction。前者代表有返回值的任务,后者代表没有返回值的任务。Fo...原创 2018-10-07 01:36:08 · 3843 阅读 · 0 评论 -
java.util.concurrent.ConcurrentHashMap源码分析(JDK1.8)
一、引言ConcurrentHashMap是Java并发工具包中的Map实现类,它支持多个线程并发操作Map。可以说,ConcurrentHashMap就是支持并发操作的HashMap。和HashMap不同的是,ConcurrentHashMap不支持添加键或值为null的键值对。ConcurrentHashMap继承关系及其内部类继承关系图(红色部分为内部类):ConcurrentHas...原创 2018-09-27 18:55:17 · 671 阅读 · 0 评论 -
Java线程池之ScheduledThreadPoolExecutor源码解析
一、引言ScheduledThreadPoolExecutor是Java并发工具包中的线程池实现类,可以用来执行定时、周期任务。相对于java.util.Timer,ScheduledThreadPoolExecutor性能更好,也能够提供更好的稳定性。Java线程池UML类图:可以看出,ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,实现...原创 2018-09-25 13:03:34 · 1275 阅读 · 0 评论 -
Java线程池之ThreadPoolExecutor源码分析
一、引言Java并发工具包自带了很多常用的线程池,程序可以将定义的Runnable、Callable任务提交到线程池当中运行,由线程池负责异步执行其中的任务。Java线程池框架结构图: 其中,Executors是一个线程池静态工厂类,可以调用其中的静态方法获取一些常用的线程池实现类。Executors的内部类DelegatedExecutorService采用了装饰者设计模式,其内部...原创 2018-09-19 14:59:56 · 632 阅读 · 0 评论 -
java.util.concurrent.FutureTask源码解析
本文参照的是JDK1.8版本的FutureTask源码一、引言FutureTask可以用来封装一个Runnable或者Callable任务,并异步执行,当用户想要返回的结果时,只需要调用get方法获取。FutureTask继承关系图: FutureTask继承了RunnableFuture接口,它可以直接作为一个Runnable或Callable提交到线程池执行。二、源码...原创 2018-09-15 22:18:46 · 4886 阅读 · 0 评论 -
java.util.concurrent.SynchronousQueue源码简析
一、引言SynchronousQueue是一个比较特殊的阻塞队列实现类,它实际上内部并不会给元素维护一系列存储空间,它维护了一组线程,这些线程正需要获取元素或者添加元素。在生产-消费者模型中,这样做的好处是可以降低从生产者到消费者中间的延迟,而在LinkedBlockingQueue或者ArrayBlockingQueue中,生产者必须将元素插入到其中存储元素的结构中然后才能转交给消费者。此外...原创 2018-09-23 16:09:20 · 2243 阅读 · 0 评论 -
java.util.concurrent.CopyOnWriteArrayList源码分析
一、引言CopyOnWriteArrayList是Java并发工具包中可支持并发操作的List集合类。当我们修改CopyOnWriteArrayList的元素时,CopyOnWriteArrayList会将内部的数组复制一份,然后进行修改,修改完成后再将保存数组的引用指向这个修改好的数组。这样做的好处是我们可以对容器进行并发的读操作而无需对整个容器加锁,它采用的是一种读、写分离的并发解决方案。...原创 2018-09-20 15:33:53 · 504 阅读 · 0 评论 -
java.util.concurrent.ArrayBlockingQueue原理简要分析
一、引言ArrayBlockingQueue是一个基于静态数组的阻塞队列,可用于实现生产-消费者模型。它和LinkedBlockingQueue存在以下几个不同点: 1、锁的实现不同 ArrayBlockingQueue的入队和出队都是使用的一个锁,意味着只能有一个线程来修改它。 LinkedBlockingQueue采用了两把锁:入队锁和出队锁,可以有一个线程负责生产,一个线程负责...原创 2018-09-14 20:49:56 · 760 阅读 · 0 评论 -
java.util.concurrent.LinkedBlockingQueue原理分析
一、引言LinkedBlockingQueue是一个用于并发环境下的阻塞队列集合类,它可以用于生产-消费者模型。什么是阻塞队列? 阻塞队列和一般的普通队列(如LinkedList)不同,它可以实现线程的阻塞添加元素和取出元素 阻塞添加:当队列元素的数量达到上限时,队列会阻塞之后尝试添加元素的线程,直到有元素被移除后才会通知该线程。 阻塞删除:当队列元素为空时,队列会阻塞之后尝试取得元...原创 2018-09-14 10:49:38 · 1939 阅读 · 0 评论 -
java.util.concurrent.CyclicBarrier原理分析
一、引言CyclicBarrier是Java并发工具包中的一个同步工具类,它允许一组线程互相等待,直到等待的线程达到指定数量后,所有等待的线程才会继续执行。我们可以称它为栅栏。CyclicBarrier的构造方法有: 构造方法 解释 public CyclicBarrier(int parties) parties为等待线程的数量,等待的线程达到这个数后才会继...原创 2018-09-13 14:08:38 · 460 阅读 · 0 评论 -
java.util.concurrent.Semaphore(信号量)原理解析
一、引言Semaphore又称信号量,用来控制同时访问访问某个特定资源的操作数量,可以理解为是用于控制线程访问数量的工具类。 Semaphore管理着一组许可(permit),许可的数量可通过构造函数来指定。在执行某个操作时必须先获得许可,并在使用完毕后释放(release)许可。如果没有许可,那么尝试获取许可的线程会进入阻塞状态直到有许可可以使用。可以想象成一个房间,房间里只能容纳3...原创 2018-09-11 21:38:18 · 1187 阅读 · 0 评论 -
java.util.concurrent.locks.ReentrantLock原理分析
一、引言ReentrantLock是JDK1.5引入的一种工具类:它可以实现可重入锁的功能。在分析它的原理之前,我们先来回顾下基础知识:什么是可重入锁? 可重入锁是一种可重复可递归调用的锁,在一个线程获取这个锁后,这个线程依然可以再次获得这个锁,而其它线程要想获得锁只能等到它全部释放之后。 比如:public class Test { static final Reen...原创 2018-09-10 21:46:17 · 569 阅读 · 0 评论 -
Java同步框架AbstractQueuedSynchronizer(AQS)原理分析
一、引言AbstractQueuedSynchronizer(以下简称AQS)是一个用于构建锁或其它同步工具的基础框架。它的内部提供了一个FIFO队列原创 2018-09-16 22:41:58 · 394 阅读 · 0 评论 -
java.util.Timer源码解析
一、引言java.util.Timer是JDK提供的定时任务执行器,可以往Timer中添加定时任务并按期执行。 使用Timer首先需要创建Timer的实例,创建实例后可以通过调用schedule方法来创建任务,Timer中的定时任务需要用一个对象TimeTask表示,用户需要重写TimeTask的run方法来定义自己的任务。Timer是一个有缺陷的定时任务执行器,在新代码中已经不再推荐使...原创 2018-09-05 17:15:34 · 286 阅读 · 0 评论 -
java.lang.ref.Reference和ReferenceQueue源码解析
一、引言java.lang.ref.Reference类表示引用类型,于JDK1.2被引入,其子类有SoftReference(软引用),WeakReference(弱引用),PhantomReference(虚引用,又称幽灵引用)。回顾一下Java引用方面的基础知识: 1、如果一个对象没有任何引用了,那么这个对象会在GC的时候被回收。在我们平时写程序时大部分都是使用强引用:Obje...原创 2018-09-04 17:57:02 · 3477 阅读 · 0 评论 -
深入理解Java序列化机制:ObjectOutputStream源码简要分析
一、引言java.io.ObjectOutputStream是实现序列化的关键类,它可以将一个对象转换成二进制流,然后可以通过ObjectInputStream将二进制流还原成对象。在阅读ObjectOutputStream源码之前,我们先来回顾一下序列化相关的基础知识: 1、需要序列化的类必须实现java.io.Serializable接口,否则会抛出NotSerializableEx...原创 2018-09-03 22:00:01 · 15493 阅读 · 3 评论 -
java.io包中的输入流、输出流相关类概览
一、引言java.io里面提供了许多I/O类,可以方便地实现数据的输入和输出 java.io包下主要包含以下几个类的类型: 1、字节输入流:如InputStream及其子类 2、字节输出流:如OutputStream及其子类 3、字符输入流:如Reader及其子类 4、字符输出流:如Writer及其子类 5、文件本地地址描述:File类 6、文件描述符:FileDescripto...原创 2018-09-02 17:20:21 · 2274 阅读 · 0 评论 -
java.util.Collections工具类方法概览
本文以JDK1.8的Collections源码进行解析一、引言java.util.Collections工具类提供了很多操作集合的方法,如果你还不了解这些方法的具体作用,那么了解其使用方法还是很有必要,可以有效的简化代码和增加其可读性 Collections类中的方法可分为一下几种类型: 1、搜索集合: 二分搜索元素://将List集合对key进行二分搜索,返回key的下标pu...原创 2018-09-06 20:34:04 · 760 阅读 · 0 评论 -
java.util.Hashtable源码分析
一、引言Hashtable在JDK中是一个古老的Map实现类,早在JDK1.0就已经存在。在新的代码中已经不推荐再使用Hashtable存储键值对,而是使用HashMap(无须多线程操作)或ConcurrentHashMap(需要多线程操作)。 Hashtable是一个线程安全的Map类,其大多数方法都加了synchronized关键字,意味着同一时间只能有一个线程对它的实例进行访问,而不是...原创 2018-09-01 20:15:50 · 516 阅读 · 0 评论 -
java.util.HashMap源码分析
一、概述HashMap是Java中常用的Map实现,它提供了一种键到值的映射,可以高效地查找键值对。HashMap内部是一种基于拉链法实现的哈希表。 HashMap的继承关系图: HashMap不是一个线程安全的类,如果需要并发操作Map应当使用ConcurrentHashMap。二、Map接口在了解HashMap前,我们先来回顾一下Map接口public inte...原创 2018-09-01 09:58:29 · 690 阅读 · 0 评论 -
java.util.LinkedList源码解析
一、概述LinkedList是一种基于链表的List实现,相比于ArrayList,它在添加元素的操作上更快。 下面是LinkedList的继承类图 LinkedList除了可以作为List以外,还可用作双端队列二、源码分析首先来看LinkedList类定义和成员变量:public class LinkedList<E> extends AbstractSequ...原创 2018-08-30 17:31:29 · 234 阅读 · 0 评论 -
java.util.ArrayList源码解析
一、概述ArrayList是Java一个很常用的集合类,它相当于一个动态数组,内部的数组大小可以根据元素实际情况自动分配,也可以自己分配大小。 在使用ArrayList的时候,应注意ArrayList并不是线程安全的,如果需要多线程并发操作应当使用CopyOnWriteArrayList,或者使用Collections工具类的synchronizedList方法将其包装。下面是Array...原创 2018-08-29 19:39:11 · 3969 阅读 · 0 评论 -
java.lang.Throwable源码解析(JDK1.8)
本文内容基于JDK1.8版本一、基础知识复习Throwable是所有异常类的父类,它提供了一系列API为我们反馈异常的信息。在分析Throwable源码前,我们先来回顾一下Java异常的基础知识: 1、Java提供了try…catch…finally…语法来实现异常处理机制,在try语句中一旦抛出一个异常对象(Throwable或其子类),如果找到了对应的catch语句块,都可以将其...原创 2018-08-28 10:35:58 · 2540 阅读 · 0 评论 -
深入分析Java中的枚举类(JDK 1.8)
一、概述在分析之前,先来回顾下枚举类的基础知识点 枚举类一般用于一个类只可能拥有有限个实例,比如季节只可拥有春夏秋冬,性别只有男女 枚举类和普通类有以下几个不同点: 1、枚举类不能指定继承的父类(因为继承了java.lang.Enum类),但是可以实现多个接口,枚举类默认实现了Comparable接口和Serializable接口(但是不能序列化) 2、枚举类的构造方法的访问权限只可为...原创 2018-08-27 10:52:26 · 8541 阅读 · 1 评论 -
java.lang.System类源码解析(JDK 1.8)
一、概述java.lang.System类是JDK提供的一个工具类,包含了很多常用的成员变量和方法,它不能被实例化。其主要功能有: 1、提供三种标准输入输出流:err、out、in,并且可以重定向输入输出流System.in,返回InputStream实例,代表标准输入流System.out,返回PrintStream,代表标准输出流System.err,返回PrintStream...原创 2018-08-26 18:32:27 · 814 阅读 · 0 评论 -
浅析Java中的String、StringBuilder和StringBuffer源码
String、StringBuilder、StringBuffer算得上是一个老生常谈的问题了,在实际使用中会经常用到这些类,了解这些类的使用和原理是十分必要的,本文将根据JDK1.8的源码分析。一、String类先来看String类的源码:public final class String implements java.io.Serializable, Comparable...原创 2018-08-25 15:09:06 · 522 阅读 · 0 评论 -
java.lang.InheritableThreadLocal实现原理分析
在了解InheritableThreadLocal之前,需要先理解ThreadLocal的实现原理,关于ThreadLocal文章可以参考我的博客: https://blog.csdn.net/abc123lzf/article/details/81978210一、前言在了解InheritableThreadLocal前,我们先来回顾下InheritableThreadLocal的使...原创 2018-08-24 15:09:37 · 330 阅读 · 0 评论 -
java.lang.ThreadLocal实现原理分析
一、简介ThreadLocal隶属java.lang包,表示线程私有变量,也可叫做线程本地变量。它为单个线程单独创立了一个副本,每个线程只可访问属于自己的变量,不可访问和修改别的线程所属的变量。 ThreadLocal属于一个泛型类,泛型参数为变量的类型,可以通过重写initialValue方法来实现对该变量初始值的设置。 ThreadLocal提供了以下API实现对变量的控制:p...原创 2018-08-23 16:09:44 · 789 阅读 · 0 评论