![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JDK源码
文章平均质量分 65
IT搬砖工ing
从今往后认真写博客
展开
-
生动形象的CAS
文章开始之前首先要吐槽一下现在的网络环境,只要你在网上搜索一个具体的问题,搜索出来的基本上都是千篇一律,各种转载各种抄袭,很难找到一点自己原创且能把东西说清楚的。 最近工作之余回顾了一下CAS的原来,发现其中有一些概念让刚接触这个东西的人真的会是一头雾水,于是想在现实生活中找一个类似的场景来说明这样的事情,并将其记录于此。首先放一张网上到处转载处可以找到的图:如果你看了这幅图能完全原创 2016-07-14 15:27:06 · 460 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码深度解析
#总体介绍基于队列的抽象同步器,它是jdk中所有显示的线程同步工具的基础,像ReentrantLock/DelayQueue/CountdownLatch等等,都是借助AQS实现的。Java中已经有了synchronized关键字,那么为什么还需要来这么一出呢?因为AQS能实现更多维度,更多场景的锁机制,例如共享锁(读锁)/基于条件的线程阻塞/可以实现公平和非公平的锁策略/可以实现锁等待的中断,而synchronized关键字由JVM实现,在代码使用层面来说,如果仅仅是使用独占锁,那synchronize原创 2021-12-30 10:25:56 · 606 阅读 · 0 评论 -
DelayQueue源码分析
延迟队列:往队列中放入的元素具有一定的延迟时间,延迟时间到期后,take或者poll方法才能获取到这些元素。先看以下延迟队列的构造://1.队列中的元素通过实现Delayed接口来实现延迟时间控制//2.队列实现BlockingQueue接口,实现了相应的阻塞功能public class DelayQueue<E extends Delayed> extends AbstractQueue<E> implements BlockingQueue<E> {原创 2021-12-30 10:25:24 · 171 阅读 · 0 评论 -
JDK1.8 SynchronousQueue源码解析
同步队列:它继承了一般的AbstractQueue和实现了BlockingQueue接口。它与其它的BlockingQueue最大的区别就在它不存储任何数据,它的内部是一个栈(非公平)或者一个队列(公平策略)用来存储访问SynchronousQueue的线程,而访问它的线程有消费者和生产者,对应于方法put和take。当一个生产者或者消费者试图访问SynchronousQueue的时候,如果找不到与之能够配对的消费者或者生产者,则当前线程会阻塞,直到对应的线程将其唤醒,或者等待超时,或者中断。以下是它的p原创 2021-12-30 10:24:50 · 160 阅读 · 0 评论 -
LinkedTransferQueue源码解析
之前写了SynchronousQueue的源码解析,其内部实现有两个数据结构:一个是栈,一个是FIFO队列,在之前的文章中主要分析了栈(非公平模式)的实现思路而没有分析队列的实现,其实是因为JDK里面本身有LinkedTransferQueue这个队列的实现,所以今天单独来说下这个队列的实现思路,主要目的方便自己以后快速的回顾。首先我们回顾一下SynchronousQueue里面的TransferStack的实现方式:1.栈中节点通过0,1,2来标记节点是获取数据还是生产数据,或者是正在匹配。2.栈中原创 2021-12-30 10:24:10 · 202 阅读 · 0 评论 -
CountDownLatch源码解析
目录#总体介绍一个同步器:能够让一个或者多个线程等待等待某个条件的到来再继续执行。大家可以把CountDownLatch初始化的值认为是有N道门,刚开始是线程调用await方法发现门关着的,所以就只有等待。而外界条件的变化是通过countDown来实现,可以认为countDown一次就是打开一道门,当countDown的次数为N时,则全部的门打开,则刚才在await处等待的线程将继续执行任务。看下具体的代码实现:public class CountDownLatch { private原创 2021-12-30 10:22:05 · 124 阅读 · 0 评论 -
CyclicBarrier源码解析
一个多线程协同器,它可以让一组线程相互等待,当等待的数量达到预设数量时这组线程通过等待继续工作。说得形象点,CyclicBarrier就好比汽车站滚动发车的模式,把客车看着CyclicBarrier,乘客看着是各个任务线程,当乘客到达客车时,需要等待另外的乘客,当乘客到齐后自动发车,如果等待乘客超时了,则将乘客全部赶下车(司机太凶残了),然后重新安排依次上车(是否要上车由乘客自己决定);每个上车的乘客都需要判断自己是否是这辆车的最后一个乘客,如果不是,则上车后立即开始睡觉,如果是最后一个,则他需要叫醒所有乘原创 2021-12-30 10:16:42 · 125 阅读 · 0 评论 -
ForkJoinPool源码深度解析
先看下ForkJoinPool构造方法: /**** parallelism: 并行度 factory: 创建工作线程的工厂实现 handler: 内部工作线程因为未知异常而终止的回调处理 asyncMode: 异步模式(对于任务的处理顺序采用何种模式),true表示 采用FIFO模式,false表示采用LIFO模式 ***/ public ForkJoinPool(int parallelism,原创 2020-06-17 14:44:20 · 2064 阅读 · 2 评论 -
二进制数的一些玩法
目录非负整数的乘法用二进制位移如何表达取小于某个数的偶数在看JDK的源码的过程中,难免会碰到一些二进制的操作,如果对这些操作不太熟悉就不明白作者到底想做什么事情,从而导致不能理解代码,那么二进制有哪些玩法呢,本文尝试着将这些玩法总结出来。非负整数的乘法用二进制位移如何表达取小于某个数的偶数...原创 2020-06-17 13:16:26 · 430 阅读 · 0 评论 -
Semaphore源码解析以及与CountDownLatch的对比
写在前面信号量,源码中的注释是这样写的 :A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each {@link #acquire} blocks if necessary until a permit is available, and then takes it. Each {@link #release} adds a permit, potentially releasing a blo原创 2020-06-03 18:12:03 · 552 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码深度解析和思考
目录写在前面总体介绍主体结构节点类的构造图形化同步队列和condition队列锁实现写锁(独占锁)获取锁节点加入同步队列同步队列中的节点尝试获取锁或者睡眠获取锁或者睡眠过程中线程被中断(取消获取锁)取消节点需要唤醒后继节点的情况释放锁共享锁获取共享锁node节点状体变化图释放锁带中断的获取锁公平/非公平同步器ConditionObject条件等待await方法signal唤醒等待线程总结写在前面AQS是整个JDK并发包的核心,要想理解其它的锁、同步器、并发容器等的实现必须先过AQS这个坎,由于Doug原创 2020-05-30 15:18:11 · 309 阅读 · 0 评论 -
CountDownLatch源码解析
目录总体介绍同步器的实现await方法countDown方法总结总体介绍一个同步器:能够让一个或者多个线程等待等待某个条件的到来再继续执行。大家可以把CountDownLatch初始化的值认为是有N道门,刚开始是线程调用await方法发现门关着的,所以就只有等待。而外界条件的变化是通过countDown来实现,可以认为countDown一次就是打开一道门,当countDown的次数为N时,则全部的门打开,则刚才在await处等待的线程将继续执行任务。看下具体的代码实现:public class原创 2020-05-30 10:48:37 · 585 阅读 · 0 评论 -
CyclicBarrier源码解析
总体介绍一个多线程协同器,它可以让一组线程相互等待,当等待的数量达到预设数量时这组线程通过等待继续工作。说得形象点,CyclicBarrier就好比汽车站滚动发车的模式,把客车看着CyclicBarrier,乘客看着是各个任务线程,当乘客到达客车时,需要等待另外的乘客,当乘客到齐后自动发车,如果等待乘客超时了,则将乘客全部赶下车(司机太凶残了),然后重新安排依次上车(是否要上车由乘客自己决定);每个上车的乘客都需要判断自己是否是这辆车的最后一个乘客,如果不是,则上车后立即开始睡觉,如果是最后一个,则他需要原创 2020-05-30 10:36:13 · 189 阅读 · 0 评论