
Java8 源码
文章平均质量分 92
jdk1.8 源码阅读总结。
留兰香丶
但行好事,莫问前程
展开
-
性能远超AtomicLong,LongAdder原理完全解读
高并发场景下可以选择 AtomicLong 原子类进行计数等操作,除了 AtomicLong,在 jdk1.8 中还提供了 LongAdder。PS:AtomicLong 在 jdk1.5 版本提供。AtomicLong 底层使用 Unsafe 的 CAS 实现,当操作失败时,会以自旋的方式重试,直至操作成功。因此在高并发场景下,可能会有很多线程处于重试状态,徒增 CPU 的压力,造成不必要的开销。LongAdder 提供了一个 base 值,当竞争小的情况下 CAS 更新该值,如果 CAS 操作失败,原创 2020-12-11 16:21:04 · 1307 阅读 · 0 评论 -
Java8 EnumMap 源码分析
一、EnumMap 概述EnumMap 是一个用于存储 key 为枚举类型的 map,底层使用数组实现(K,V 双数组)。下面是其继承结构:public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializable, Clon...原创 2019-05-02 17:26:13 · 903 阅读 · 0 评论 -
Java8 ThreadLocal 源码分析
一、ThreadLocal 简介在学习源码之前,有一个概念我们需要先明白:ThreadLocal 可以使多线程间数据读写隔离,因此 ThreadLocal 解决的是线程局部变量安全性问题,并不是多线程间共享变量安全性问题。ThreadLocal 在使用时必须先初始化 value,否则会报空指针异常,你可以通过 set 方法与重写 initialValue 方法两种方式初始化 value。下面...原创 2019-05-01 17:35:03 · 498 阅读 · 0 评论 -
Java8 IdentityHashMap 源码分析
在讲这个数据结构之前,我们先来看一段代码: public static void main(String[] args) { IdentityHashMap<String, Integer> map = new IdentityHashMap<>(); map.put("Hello " + "World", 1); m...原创 2019-03-20 20:20:01 · 849 阅读 · 0 评论 -
Java8 CountDownLatch 源码分析
一、CountDownLatch 概述1.1 什么是 CountDLatch闭锁(CountDownLatch)是 java.util.concurrent 包下的一种同步工具类。闭锁可以用来确保某些活动直到其他活动都完成后才执行。闭锁相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当达到结束状态时,这扇门会打开,并允许所有的线程通过。1.2 CountD...原创 2019-03-11 20:14:15 · 860 阅读 · 0 评论 -
Java8 ReentrantLock 源码分析
一、ReentrantLock 概述1.1 ReentrantLock 简介故名思义,ReentrantLock 意为可重入锁,那么什么是可重入锁呢?可重入意为一个持有锁的线程可以对资源重复加锁而不会阻塞。比如下面这样: public synchronized void f1() { f2(); } private synchronized void ...原创 2019-03-07 20:05:07 · 694 阅读 · 0 评论 -
Java8 CopyOnWriteArrayList 源码分析
一、CopyOnWriteArrayList 概述1.1 概念概述CopyOnWriteArrayList 是 juc 包下一个线程安全的并发容器,底层使用数组实现。CopyOnWrite 顾名思义是写时复制的意思,其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,会把内容 Copy 出去形成一个新的内容然后再进行修改,这是一种延时懒惰策略。假设往一个容器添加元素...原创 2019-02-15 19:47:26 · 582 阅读 · 0 评论 -
Java8 Hashtable 源码阅读
一、Hashtable 概述Hashtable 底层基于数组与链表实现,通过 synchronized 关键字保证在多线程的环境下仍然可以正常使用。虽然在多线程环境下有了更好的替代者 ConcurrentHashMap,但是作为一个面试中高频的知识点,我们还是有必要了解一下其内部实现细节的。1.1 内部属性 // 内部数组 private transient Entry&amp;amp;amp;amp;amp;amp;lt...原创 2019-01-24 15:02:08 · 844 阅读 · 0 评论 -
Java8 ArrayBlockingQueue 源码阅读
一、什么是 ArrayBlockingQueueArrayBlockingQueue 是 GUC(java.util.concurrent) 包下的一个线程安全的阻塞队列,底层使用数组实现。除了线程安全这个特性,ArrayBlockingQueue 还有其他的特点:当队列已满时,会阻塞后面添加元素 [put(E e)] 的线程,直到调用了移除元素的方法队列不满的情况下会唤醒前面添加元素的线...原创 2019-01-21 15:47:01 · 623 阅读 · 0 评论 -
Java8 LinkedHashMap 源码阅读
如果你对 HashMap 的源码有了解的话,只需要一图就能知道 LinkedHashMap 的原理了,但是具体的实现细节还是需要去读一下源码。一、LinkedHashMap 简介1.1 继承结构从继承结构上来讲 LinkedHashMap 继承自 HashMap,LinkedHashMap 中没有提供任何增删改查的方法,而是直接复用了父类 HashMap 中的方法。1.2 内部数据结构...原创 2018-12-31 16:30:43 · 759 阅读 · 0 评论 -
Java8 PriorityQueue 源码阅读
一、什么是 PriorityQueue这篇文章带大家去了解一个 jdk 中不常用的数据结构 PriorityQueue(优先队列),虽然在项目里用的不多,但是它本身的设计实现还是很值得大家看一看的。PriorityQueue 底层是一个用数组实现的完全二叉树,但它并不只是一个完全二叉树,在没有自定义比较器(自然排序)的情况下,更严格的来讲它是一个基于数组实现的小顶堆(父节点的元素值小于左右孩子...原创 2018-12-20 22:26:03 · 898 阅读 · 7 评论 -
Java8 HashMap 扩容机制与线程安全分析
如果大家有仔细阅读过 HashMap 的源码就会发现 HashMap 的哈希表初始化并不是在其构造函数中进行的,而是 resize() 方法。这篇文章不对 HashMap 中的树进行介绍。一、HashMap 四个构造函数这里把 HashMap 的四个构造函数全贴出来,主要是给大家一个参照。PS:并不是所有的构造函数都初始化了 threshold,但是所有的构造函数都初始化了加载因子,另外初...原创 2018-12-17 21:19:27 · 3601 阅读 · 0 评论