Java源码解析
文章平均质量分 94
专栏主要包含了java集合框架和JUC的源码的分析。内容持续更新。
ONROAD0612
不问前程何如,但愿落幕无悔
展开
-
JUC--ConcurrentHashMap源码分析(二)(基于JDK1.8)
1 概述前面我们分析了ConcurrentHashMap(JDK1.7)(请参考JUC--ConcurrentHashMap源码分析(一)(基于JDK1.7))和HashMap(JDK1.8)(请参考Java集合框架--HashMap源码分析(二)(基于JDK1.8))的源码,我们直到ConcurrentHashMap其实就是针对HashMap(JDK1.7)进行了分段加锁的方式,也就是针对H...原创 2018-09-25 11:19:48 · 405 阅读 · 0 评论 -
JUC--队列概述
1 概述Java中的队列是一个FIFO的数据结构,适用于生产者消费者模式。Queue接口与List、Set同一级别,都是继承了Collection接口,LinkedList也实现了Deque接口。当然java中的队列有阻塞和非阻塞队列,下面我们就来看一看Java中队列都有哪些实现。2 类图下面我们来看一下java中队列的家庭成员。3 详细说明3.1 QueueQue...原创 2018-09-26 19:52:53 · 787 阅读 · 0 评论 -
Java集合框架--LinkedHashMap源码分析(基于JDK1.8)
1 概述前面我们对HashMap的源码进行了分析(详情可以参考:Java集合框架--HashMap源码分析(二)(基于JDK1.8),我们知道HashMap针对数据的插入是通过计算key的hash值和table大小来确定在数组及链表当中的位置的,所以HashMap没法保存插入数据的顺序。为了保存插入元素的顺序,就有了我们现在要提到的LinkedHashMap,从类的命名我们可以猜想,Linke...原创 2018-09-26 11:32:10 · 237 阅读 · 0 评论 -
Java集合框架--HashSet源码分析(基于JDK1.8)
1 概述前面的文章,我们分析了List和Map的一些实现类。现在我们开始分析Set的实现类。Set和List相同都是用于存放数据的集合,不同的是Set中的元素不允许重复(通过hashCode和equals函数来保证不重复性),如果数据相同就会进行覆盖。Set的实现是依赖于Map的实现,我们知道Map中的key也是不允许重复的。接下来我们就来看一下Set的具体实现类HashMap的实现吧...原创 2018-09-26 16:23:55 · 254 阅读 · 0 评论 -
Java集合框架--HashMap源码分析(一)(基于JDK1.7)
1 概述Map是我们常使用得一种用于存放键值对的数据结构,现在我们来分析一下Map的实现类HashMap的具体实现,我们直到JDK1.8实现HashMap是使用数组+链表的数据结构,而JDK1.8为了提高查询效率改进了数据结构,加入了红黑树的数据结构来实现。现在在我们分析JDK1.8的HashMap之前先来看一下JDK1.7的实现。2 JDK1.7实现2.1 数据结构图我们首先来看...原创 2018-09-12 09:52:26 · 234 阅读 · 0 评论 -
JUC--CyclicBarrier源码分析(基于JDK1.8)
1 概述通过前面对CyclicBarrier(请参考JUC-- CyclicBarrier学习(一)简介和使用)的介绍,我们对CyclicBarrier的使用有了一个深度的认识,现在就要针对CyclicBarrier的源码进行分析,CyclicBarrier的结构如下:从上图我们可以猜想CyclicBarrier的实现主要就是依靠ReentrantLock和Condition。2 ...原创 2018-09-06 10:38:11 · 226 阅读 · 0 评论 -
JUC--Semaphore源码分析(基于JDK1.8)
1 概述通过前面(参考JUC-- Semaphore学习(一)简介和使用 )对Semaphore的介绍,我们对Semaphore有了一个基本的认识,我们知道Semaphore通常用于限制对资源使用的线程数量,现在就要针对Semaphore的源码进行分析,Semaphore的结构如下:从上图我们可以发现,这里又出现了AQS的身影,我们可以看出AQS的重要性。所以再学习JUC的时候非常有必...原创 2018-09-07 17:23:22 · 275 阅读 · 1 评论 -
JUC--ConcurrentHashMap源码分析(一)(基于JDK1.7)
1 概述前面分析研究了HashMap,我们知道HashMap不是线程安全的,那么如果需要线程安全的HashMap怎么办呢?这个时候我们有几种解决方法。(1)使用HashTable代替HashMap;(2)使用Collections.synchronizeMap(hashMap);(3)使用ConcurrentHashMap;针对这三种方法得区别我们在文章后面再谈,下面我们就针对...原创 2018-09-18 11:02:34 · 242 阅读 · 0 评论 -
JUC--CountDownLatch源码分析(基于JDK1.8)
1 概述前面一篇文章()我们对CountDownLatch进行了简单的介绍,并对CountDownLatch的使用使用了例子展示,那么这一篇文章我们就要来看一看CountDownLatch底层到地是怎么实现的。2 UML类图注意上图仅仅展现了类关系,针对类内部的结构没有进行展示,从上面我们可以猜测CountDownLatch的内部功能的实现又和AQS这个玩意脱不了干系,多半又是通过...原创 2018-08-27 17:28:03 · 263 阅读 · 0 评论 -
JUC--Condition源码分析(基于JDK1.8)
1 概述通过前面的文章(JUC--Condition学习(一)简介和使用),我们对Condition有了一个初步的认识,并且我们也知道了如何使用Condition,现在我们就来看一看Condition到底是如何实现线程的等待和唤醒的。2 等待队列在我们学习AQS的时候,我们知道当线程获取锁失败的时候会进入CLH队列,以等待状态(WAITING)存在于同步队列。而当我们调用Conditi...原创 2018-09-04 11:46:11 · 477 阅读 · 0 评论 -
JUC--ReenTrantLock学习(二)源码分析之获取锁
1 概述前面我们学习了ReentrantLock的用法以及与synchronized的比较(详情请参考这篇文章:JUC--ReenTrantLock学习(一)简介与使用),同时也对AQS有了初步掌握,我们知道AQS是JUC里面大部分工具实现的基础类,并且使用了模板方法模式了实现JUC工具类。现在我们就开始对ReenTrantLock的源码进行学习。首先我们还是来看一下ReentrantLo...原创 2018-08-23 14:16:27 · 317 阅读 · 0 评论 -
JUC--ReenTrantLock学习(三)源码分析之释放锁
1 概述通过前面一篇文章(JUC--ReenTrantLock学习(二)源码分析之获取锁)我们已经学习了ReenrantLock获取锁的相关知识,这里我们将要学习ReenTrantLock释放锁的内容。下面我们直接开始源码的学习。2 源码分析首先,我们依然来看一下释放锁unlock的调用流程。(1)unlock public void unlock() { ...原创 2018-08-23 16:59:22 · 320 阅读 · 0 评论 -
JUC--AQS源码分析(三)阻塞和唤醒线程
1 概述上一篇文章 JUC--AQS源码分析(二)同步状态的获取与释放,我们学习到了同步状态的获取与释放的源码,并且对线程的阻塞和唤醒有了一个初步的了解,这里我们进行深一步的分析。2 阻塞我们知道在获取线程同步状态失败的时候,会将线程加入到CLH同步队列,并且进行自旋等待。而在自旋等待方法acquireQueued中我们可以看见需要再次进行获取同步状态,如果获取同步状态失败则需要判断当...原创 2018-08-17 10:57:53 · 552 阅读 · 0 评论 -
JUC--AQS源码分析(一)CLH同步队列
1 概述了解过JUC的源码,我们就可以知道JUC下面很多工具的实现都是依靠AQS,而AQS中用于保存等待线程的队列就是CLH。CLH是一个FIFO的队列。队列的每一个节点都是一个Node对象。当前线程获取同步状态失败的时候就会进入CLH队列。而当同步状态被释放的时候会通知首节点再次去获取同步状态。2 Node节点首先我们来看看Node节点的实现到底是怎么回事,源码如下:stati...原创 2018-08-13 14:29:27 · 976 阅读 · 0 评论 -
Java高并发--ThreadLocal使用及源码分析
1概述线程本地变量(ThreadLocal)位每一个线程创建一个变量副本,从而线程就可以单独使用自己拥有的变量副本,而相互之间不产生影响。而线程本地变量与线程同步机制中的共享变量有什么区别呢?很明显,每个线程对共享变量的修改对于其余线程是可见的,而每个线程对线程本地变量的修改对于其余线程是不可见的。2示例package com.liutao.concurrent;public c...原创 2018-07-24 13:49:57 · 278 阅读 · 0 评论 -
JUC--AQS源码分析(二)同步状态的获取与释放
1概述上一遍文章JUC--AQS源码分析(一)CLH同步队列我们了解了CLH同步队列的结构,以及同步队列的入列和出列。那么通过这篇文章我们将了解到同步状态的获取和释放。当然这里针对同步状态的获取和释放就需要区分共享模式和独占模式。通过查看AQS的源码我们可以发现AQS中使用了模板方法模式(针对模板方法模式我们可以查看Java设计模式--模板方法模式)。AQS提供了大量的模板方法,主要分成三...原创 2018-08-15 11:48:29 · 497 阅读 · 0 评论 -
Java集合框架--概述
一、概述 Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)。Java集合类的整体框架如下:从上图我们可以看出,集合框架下主要有集合类Li...原创 2017-08-17 09:14:27 · 304 阅读 · 0 评论 -
Java集合框架--ArrayList源码分析(基于JDK1.8)
1概述ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长。ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。2源码分析2.1类的继承关系...原创 2017-08-17 10:53:45 · 289 阅读 · 0 评论 -
Java集合框架--LinkedList源码分析(基于JDK1.8)
1、概述通过前面的分析,我们知道了ArrayList是基于数组实现的,因此比较适合查询和修改比较多的操作。而LinkedList是基于双向链表实现的,因此比较适合添加和删除。2、LinkedList数据结构我们可以看见LinkedList是一个基于双向链表的数据结构(有指向前一个和指向后一个的引用),因此如果我们要遍历集合,可以进行双向遍历。3、源码分析3.1类的继承...原创 2017-08-17 15:48:20 · 395 阅读 · 0 评论 -
Java集合框架--HashMap源码分析(二)(基于JDK1.8)
1 概述前面(参考Java集合框架--HashMap源码分析(一)(基于JDK1.7) )我们基于JDK1.7分析了HashMap的实现,我们知道了JDK1.7实现HashMap是基于链表和数组来实现的,而JDK1.8在数据结构上做了改了,添加进了红黑树的数据结构,红黑树的查询时间复杂度为O(log n),所以可以使用红黑树来降低当Hash冲突比较严重,链表长度过长而导致查询效率过低的情况。...原创 2017-08-18 15:00:17 · 396 阅读 · 0 评论 -
Java集合框架--TreeMap源码分析(基于JDK1.8)
1、概述当我们需要把插入的元素进行排序的时候,就需要使用的TreeMap。从名字我们可以看出TreeMap的实现肯定和树这种数据结构有关,当然TreeMap的实现是基于红黑树的。2、示例package com.liutao.collection;import java.util.Map;import java.util.TreeMap;/** * @Author:LIUT...原创 2018-05-06 17:27:03 · 310 阅读 · 0 评论