多线程
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线程池源码解析(ThreadPoolExecutor)
一、简介线程池有降低资源消耗,提高响应速度,提高线程的可管理性的优点。本文以ThreadPoolExecutor类为例,通过阅读源码,分享一下线程池的实现原理。二、源码阅读先来看看继承关系最顶层是一个Executor接口,,就一个 void execute(Runnable command) 方法,代表提交一个任务。public interface Executor { void execute(Runnable command);}接着是ExecutorServic,一般我们定义原创 2020-05-26 14:47:18 · 367 阅读 · 0 评论