JDK源码分析测试
Burgess_Lee
对编程语言和新技术非常感兴趣,志同道合者我们一起来学习,如有好的建议或不对的地方, 还希望广大程序猿予以指正。
展开
-
02 从JDK源码角度看Boolean
Java的Boolean类主要作用就是对基本类型boolean进行封装,提供了一些处理boolean类型的方法,比如String类型和boolean类型的转换。主要实现源码如下图所示,具体实现代码可自行查看对应的代码。既然是对基本类型boolean的封装,那必然要有一个变量来保存,即value,而且它被声明为final,表明它是不可变的。两种构造函数可分别传入boolean和Strin...原创 2018-09-29 11:45:31 · 167 阅读 · 0 评论 -
Semaphore源码分析
基于jdk1.8进行分析的。Semaphore,计数信号量,类似于一个计数器,在计数器不为0的时候对线程就放行,一旦达到0,那么所有请求资源的新线程都会被阻塞。下面我们首先看一个DEMO演示。package demo;import java.util.concurrent.Semaphore;/** * Semaphore示例例程 * @ClassName: Semaph...原创 2019-04-26 12:04:55 · 131 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码分析
基于JDK1.8进行分析的。在分析AbstractQueuedSynchronizer之前先分析一下LockSupport这个类,以为这个是关于这些锁中最基本的锁。LockSupport类继承结构public class LockSupport可以看见自己就是一个类,而且无继承无实现。成员属性 //unsafe中的,以后常见 private stati...原创 2019-04-22 16:14:26 · 198 阅读 · 0 评论 -
CountDownLatch源码分析
基于jdk1.8源码进行分析的。CountDownLatch是JDK 5+里面闭锁的一个实现,相当于在开放之前,所有的线程都会被阻塞,当开放之后,所有线程都进行执行,但是开放之后就不能在关闭。它有一个正数计数器,countDown方法对计数器做减操作,await方法等待计数器达到0,所有await的线程都会阻塞直到计数器为0或者等待线程中断或者超时。下面我们看一下DEMO演示。packa...原创 2019-04-26 15:52:25 · 362 阅读 · 0 评论 -
Thread源码分析
基于jdk1.8进行分析的。继承结构publicclass Thread implements Runnable可见实现了Runnable接口,那么我们顺便看一下Runnable接口的源码。public interface Runnable { public abstract void run();}由此联想到是不是Thread重写了run方法呢?我们在此看一下...原创 2019-04-15 12:00:16 · 151 阅读 · 0 评论 -
ReferenceQueue、Reference及其子类源码分析
基于jdk1.8进行分析的。ReferenceQueueReference queues,在适当的时候检测到对象的可达性发生改变后,垃圾回收器就将已注册的引用对象添加到此队列中。在一个对象被垃圾回收器扫描到将要进行回收时,其相应的引用包装类,即reference对象会被放入其注册的引用队列queue中。可以从queue中获取到相应的对象信息,同时进行额外的处理。比如反向操作,数据清理,资源...原创 2019-04-15 15:53:51 · 171 阅读 · 0 评论 -
Exchanger源码分析
基于jdk1.8源码进行分析的。Exchanger用于两个线程之间交换数据。继承结构public class Exchanger<V>可以简单没有继承什么类,也没实现什么接口。构造方法 public Exchanger() { participant = new Participant(); }构造方法实例化Particip...原创 2019-04-28 10:08:06 · 442 阅读 · 0 评论 -
Condition源码分析
基于jdk1.8进行分析的。之前有写到AQS和ReentrantLock源码分析,当然少不了的就是分析一下Condition。 通过源码来看是一个接口。下面我们看看这个接口定义的方法。public interface Condition { //造成当前线程在接到信号或被中断之前一直处于等待状态 void await() throws InterruptedExcepti...原创 2019-04-24 11:37:18 · 106 阅读 · 0 评论 -
ReadWriteLock源码分析
基于jdk1.8进行分析的。ReadWriteLock也就是我们常说的是读写锁。解释过来就是:当写操作时,其它线程无法读取或写入数据, 当读操作时,其它线程无法写数据,但却可以读取数据。前面介绍的ReentrantLock是独占锁,这样的话,也就意味着在并发量比较大的情况下,还是效率比较低,因为操作中读/读、读/写、写/写都不能同时发生,从某种程度上降低了程序的执行效率。对Reentr...原创 2019-04-24 15:25:01 · 602 阅读 · 0 评论 -
ArrayBlockingQueue源码分析
基于jdk1.8源码进行分析的。之后有三四篇博文都是针对BlockingQueue接口的实现类进行源码分析。阻塞队列在我的博文分类-多线程里面也有一些相关方面的分析介绍,这里是基于具体实现类的源码分析。下面开始正题。首先看一下BlockingQueue接口源码。public interface BlockingQueue<E> extends Queue<E>...原创 2019-05-05 11:28:02 · 100 阅读 · 0 评论 -
LinkedBlockingQueue源码分析
基于jdk1.8进行分析的。下面我们来看BlockingQueue接口的第二个实现类LinkedBlockingQueue。类继承结构public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Se...原创 2019-05-05 14:25:28 · 117 阅读 · 0 评论 -
PriorityBlockingQueue源码分析
基于jdk1.8源码进行分析的。看完了两个BlockingQueue的实现类,下面我们来看一下PriorityBlockingQueue的实现,也就是有优先级的阻塞队列。根据前面的经验大致猜测,感觉下来,知道了对应的源码实现过程,下面去验证一下自己的想法是否正确。类继承结构public class PriorityBlockingQueue<E> extends Abst...原创 2019-05-05 15:35:33 · 184 阅读 · 0 评论 -
PriorityQueue的源码分析
基于jdk1.8源码进行分析的。上面刚分析了优先阻塞队列,是基于二叉堆实现的,下面我们看一下优先队列的实现。类继承结构public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable 继承了AbstractQueue列,实现了Serializ...原创 2019-05-05 17:47:35 · 153 阅读 · 0 评论 -
CyclicBarrier源码分析
基于jdk1.8源码进行分析的。继承结构public class CyclicBarrier构造方法CyclicBarrier(int parties) public CyclicBarrier(int parties) { this(parties, null); }通过源码我们看到是通过调用另外一个构造方法实现的。CyclicBar...原创 2019-04-30 16:11:03 · 98 阅读 · 0 评论 -
ThreadLocal源码分析
前面写了一些关于JUC包下的一些主要常见类的源码分析,下面开始一段新的篇章,其他多线程开发设计到的一些方式,首先是ThreadLocal的源码分析。声明:基于JDK1.8源码进行分析的。用途上来讲,一般情况下,通过ThreadLocal.set(Object obj) 到线程中的对象obj是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。其实简单来...原创 2019-05-06 10:23:15 · 92 阅读 · 0 评论 -
ReentrantLock源码分析
基于jdk1.8进行源码分析。首先还是老样子,看类的继承结构继承结构public class ReentrantLock implements Lock, java.io.Serializable 可以看到实现了Lock接口和Serializable接口。Serializable不用说,是关于序列化相关的接口,那么我们看一下接口Lock源码。public interfa...原创 2019-04-22 12:01:04 · 137 阅读 · 0 评论 -
synchronized用法
使用多线程,或者学习多线程不得不提到或者多少会想到的实现就是通过重量级锁,也就是synchronized关键字,今天对于这个关键字的使用进行一下整体上的总结。很抱歉的是好久都没有更新上这篇博客,直到今天才有时间处理。该关键字用来处理多线程同步的问题用到的几率比较多。主要有以下几种用法。修饰一个代码块,作用的对象是调用这个代码块的对象 修饰一个方法,作用的对象是调用这个方法的对象...原创 2019-04-17 09:32:12 · 84 阅读 · 0 评论 -
TreeSet源码分析
基于jdk1.8源码进行分析的。之前已经对TreeMap的源码分析过了。该类主要将Set中的元素按照一定的规则进行排序存储。在其源码的内部实现中(如下),可以看到TreeSet时借助了TreeMap来实现的。下面直接上TreeSet的源码。继承结构public class TreeSet<E> extends AbstractSet<E> im...原创 2019-04-09 16:38:46 · 111 阅读 · 0 评论 -
01 如何找到java对应的c/c++源码
很多时候java经常被c鄙视,因为c说我是你的基础,但java竟然有如此强的生命力就必然有其存在的价值。本文不探讨各种开发语言的优劣,仅仅介绍如何找到java对应c/c++实现的源码。当我们追究一个java类到jdk库的时候,可能会遇到一个方法被声明为native,是的,它表明是一个由c/c++实现的本地方法,在运行时JVM将通过一定的映射规则找到相应的c/c++函数。如果你使用过jni对这种...转载 2018-09-29 10:54:44 · 2110 阅读 · 0 评论 -
03 从JDK源码看String类(1)
概况Java 语言使用 String 类用来代表字符串,实际上 String 对象的值是一个常量,一旦创建后不能被改变。正式因为其不可变,所以它是线程安全地,可以多个线程共享。相信对于 String 的使用大家都再熟悉不过的了,这里就了解下 JDK 中怎么实现 String 类的。继承结构 类定义public final class String implements...原创 2018-09-29 15:22:47 · 180 阅读 · 0 评论 -
ArrayList源码分析
基于jdk1.8public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable继承自AbstractList,实现了List RandomAccess Cloneable...原创 2019-03-21 18:07:02 · 97 阅读 · 0 评论 -
Vector源码分析
基于JDK1.8源码进行分析的Vector其实,Vector的内部实现和ArrayList的内部实现基本一致,内部都是借助于数组来实现的。继承结构public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, ...原创 2019-03-22 15:11:32 · 87 阅读 · 0 评论 -
CopyOnWriteArrayList源码分析
提到CopyOnWriteArrayList,就不得不另外带上CopyOnWriteArraySet。声明:源码是基于JDK1.8的。基本思想是一旦对容器有修改,那么就“复制”一份新的集合,在新的集合上修改,然后将新集合复制给旧的引用。当然了这部分少不了要加锁。显然对于CopyOnWriteArrayList/CopyOnWriteArraySet来说最大的好处就是“读”操作不需要锁了。...原创 2019-03-22 16:01:00 · 134 阅读 · 0 评论 -
HashMap和HashTable区别总结
1、继承类不一样HashMap继承的是AbstractMap,Hashtable继承的是Dictionary。实现的接口一致(Map、Cloneable和Serializable)2、初始容量不一样HashMap默认容量为16,且容量只能是2的幂次方;Hashtable默认容量为11,容量并没有2的幂次方的限制,增加的方式是 oldCap*2+1。3、HashMap是线程不安全的,...转载 2019-04-04 16:42:50 · 192 阅读 · 0 评论 -
LinkedList源码分析
基于jdk1.8进行分析的。类继承关系public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable可以看到,LinkedList实现了Li...原创 2019-04-01 10:32:14 · 63 阅读 · 0 评论 -
HashTable源码分析
基于JDK1.8进行分析的,Hashtable类的实现也是基于“数组和链表”来实现的。继承结构public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable通过上面可以看到继承的是Dict...原创 2019-04-08 10:43:58 · 150 阅读 · 0 评论 -
ConcurrentHashMap源码分析
基于jdk1.8进行分析的。属于JUC包下的。下次继续。以前版本的ConcurrentHashMap的实现思路如下:HashMap是线程不安全的。Hashtable是线程安全的。看过Hashtable源码的我们都知道Hashtable的线程安全是采用在每个方法来添加了synchronized关键字来修饰,即Hashtable是针对整个table的锁定,这样就导致HashTable容器在竞争激烈...原创 2019-04-08 10:55:49 · 96 阅读 · 0 评论 -
LinkedHashMap源码分析
基于jdk1.8进行分析的。HashMap源码已经分析过了,如果不了的,可以去看之前博主写的博客,大致了解一下。当然也只是主要的一些,如果有时间的话,还是自己翻一下比较好。话不多说,开始正题。继承结构public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,...原创 2019-04-09 10:53:05 · 100 阅读 · 0 评论 -
WeakHashMap源码分析
基于jdk1.8源码实现的。WeakHashMap也是一个“数组和链表”的结合体。继承结构public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>通过上面可以看到继承了AbstractMap类,实现了Map接口。与HashMap的区别...原创 2019-04-09 11:52:26 · 94 阅读 · 0 评论 -
HashSet源码分析
基于jdk1.8进行分析的。HashSet集合是不允许重复元素的,怎么保证的呢?结论是:HashSet是借助于HashMap的key不允许重复这个特性来实现的。HashMap是操作键值对,而HashSet是操作HashMap的key完成相关操作,或者这么说,HashSet全部的操作是借助于HashMap经过某种封装得到的。继承结构public class HashSet<E&g...原创 2019-04-09 14:38:03 · 73 阅读 · 0 评论 -
TreeMap源码分析
基于jdk1.8进行分析的。本来想先分析TreeSet,后来按照HashMap和HashSet的实现方式来看,还是先看TreeMap的源码。TreeMap的内部是基于红黑树来完成的。红黑树的5个性质:性质 1:每个节点要么是红色,要么是黑色。 性质 2:根节点永远是黑色的。 性质 3:所有的叶节点都是空节点(即 null),并且是黑色的。 性质 4:每个红色节点的两个子节点都是黑色。...原创 2019-04-09 14:49:18 · 70 阅读 · 0 评论 -
HashMap源码分析
基于jdk1.8Map接口下常用的集合有HashMap、HashTable、LinkedHashMap等。相比HashMap,Hashtable是线程安全的,Hashtable中的方法都用了synchronized进行了同步,下面开始源码解读。继承结构public class HashMap<K,V> extends AbstractMap<K,V> ...原创 2019-04-03 18:05:20 · 89 阅读 · 0 评论 -
Executor以及Executors源码分析
基于JDK1.8源码进行分析的。首先我们看一下Executor接口的源码。public interface Executor { void execute(Runnable command);}该接口定义了一个规范,也就是execute方法的规范,里面需要传入Runnable类或者其子类的对象。该接口有一个实现接口,ExecutorService。下面我们看一下该接口的源码...原创 2019-05-06 15:51:14 · 452 阅读 · 2 评论