源码解析
weixin_44029692
这个作者很懒,什么都没留下…
展开
-
CountDownLatch源码分析
一:简介CountDownLatch可以使一个或者多个线程等待其他线程都执行完毕后再执行。CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,调用await()的线程处于挂起状态,当计数器递减到0时会唤醒挂起的线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。比如,过山车之类的,通常等位置坐满了,再运行。CountDownLa原创 2020-06-29 15:00:24 · 106 阅读 · 0 评论 -
JUC并发基石之AQS源码解析--共享锁的获取与释放
一:简介前面我们以分析了AQS独占锁的获取与释放,本篇我们来看看共享锁,AQS对于共享锁与独占锁的实现框架还是比较类似的。共享锁与独占锁的区别在于,独占锁是独占的,因此当独占锁已经被某个线程持有时,其他线程只能等待它被释放后,才能去争锁,并且同一时刻只有一个线程能争锁成功。而对于共享锁而言,它可以被多个线程同时持有,因此如果一个线程成功获取了共享锁,那么其他等待在这个共享锁上的线程就也可以尝试去获取锁,而不需要等到该节点释放锁的时候。所以,在共享锁模式下,在获取锁和释放锁结束时,都会唤醒后继节点,这与原创 2020-06-28 16:31:49 · 202 阅读 · 0 评论 -
读写锁ReentrantReadWriteLock源码分析
一:简介ReentrantReadWriteLock 有两把锁:ReadLock 和 WriteLock,一个读锁一个写锁,合称“读写锁”。其实 ReadLock 和 WriteLock 是靠内部类 Sync 实现的锁。Sync 是 AQS 的一个子类,比如我们分析过的ReentrantLock也是这样的。在 ReentrantReadWriteLock 里面,读锁和写锁的锁主体都是 Sync,但读锁和写锁的加锁方式不一样。读锁是共享锁,写锁是独享锁。读锁的共享锁可保证并发读非常高效,而读写、写写的过程原创 2020-06-23 10:59:05 · 87 阅读 · 0 评论 -
ReentrantLock各种加锁方式源码分析(公平,非公平,可中断,可定时加锁)
之前我们分析过AbstractQueuedSynchronizer的独占锁的获取与释放的源码,ReentrantLock是基于AbstractQueuedSynchronizer的独占锁实现的锁,今天我们来分析它各种加锁的方式,比如公平锁,非公平锁,可中断加锁,一定时间加锁等。一:公平锁与非公平锁public class ReentrantLock implements Lock, java.io.Serializable { private final Sync sync; //内原创 2020-06-20 18:19:14 · 132 阅读 · 0 评论 -
JUC并发基石之AQS源码解析--独占锁的释放
JUC并发基石之AQS源码解析–独占锁的获取上一篇文章中,我们分析了独占锁的获取操作, 这篇文章我们来看看独占锁的释放,释放锁的逻辑相对简单,我们来看源码:public final boolean release(int arg) { // 由子类来实现具体的逻辑 if (tryRelease(arg)) { Node h = head; // 头节点不为空 并且waitStates不为0 if原创 2020-06-19 10:54:01 · 176 阅读 · 0 评论 -
JUC并发基石之AQS源码解析--独占锁的获取
一、简介AQS(AbstractQueuedSynchronizer),抽象队列同步器,是Java中众多的锁以及并发工具的基础,比如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、CyclicBarrier,AQS有独占锁以及共享锁,两种实现,今天,我们来分析AQS获取独占锁的源码。二、源码分析先看看继承关系它继承了AbstractOwnableSynchronizer,实现了序列化的接口。对于AbstractOwnableSynchron原创 2020-06-17 17:22:01 · 211 阅读 · 0 评论 -
线程池之ScheduledThreadPoolExecutor线程池源码分析
一、简介之前分析过ThreadPoolExecutor这个线程池的源码,Java线程池源码解析(ThreadPoolExecutor),今天来分析它的一个子类ScheduledThreadPoolExecutor,它可以用来实现定时任务,首先思考一下如果是你,你会怎么实现?对于我,我想的是用一个最小堆存储任务,然后线程不断从这个最小堆里面拿任务,对于还没到时间的任务,让线程沉睡响应的时间即可。不过新加入一个任务,看这个任务是否会变成最小堆的堆顶,也就是延迟时间最小的任务,是的话就需要去唤醒线程,更新睡眠原创 2020-06-16 17:07:22 · 180 阅读 · 0 评论 -
【Java集合源码解析】ArrayList源码分析
一、简介ArrayList的底层实现原理是动态数组,所以它需要占据了一块连续的内存空间,其长度就是数组的大小,因为底层是数组,所以ArrayList可以以O(1)的时间复杂度去根据下标访问元素。在每次添加新的元素时,ArrayList都会检查是否需要进行扩容操作,扩容是十分消耗性能的操作,所以知道集合组要多大的容量,再初始化的时候就进行赋值。二、源码阅读先来看看继承关系ArrayList实现了List,提供了基础的添加、删除、遍历等操作。ArrayList实现了RandomAccess,提供了随原创 2020-05-27 10:27:48 · 136 阅读 · 0 评论 -
线程池shutdown()和shutdownNow()源码解析
一、区别介绍shutdown()当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。shutdownNow()执行该方法,线程池的状态立刻变成STOP状态,并试图停止所有正在执行的线程,不再处理还在池队列中等待的任务,当然,它会返回那些未执行的任务。ShutdownNow()并不代表线程池就一定立即就原创 2020-05-25 22:45:14 · 613 阅读 · 0 评论 -
【Java集合源码解析】LinkedList源码分析
LinkedList 与 ArrayList 一样实现 List 接口,只是 ArrayList 是 List 接口的大小可变数组的实现,LinkedList 是 List 接口链表的实现。基于链表实现的方式使得 LinkedList 在随机插入和删除时更优于 ArrayList,而随机访问则比 ArrayList 逊色些。本文主要通过源码分析 LinkedList。LinkedList 的类结构public class LinkedList<E> extends AbstractSequ原创 2020-05-22 20:10:04 · 153 阅读 · 0 评论