J.U.C
文章平均质量分 94
主要分享J.U.C框架下的内容。
码道人生
物来顺应,未来不迎,当时不杂,既过不恋
展开
-
CountDownLatch原理详解
介绍当你看到这篇文章的时候需要先了解AQS的原理,因为本文不涉及到AQS内部原理的讲解。CountDownLatch是一种同步辅助,让我们多个线程执行任务时,需要等待线程执行完成后,才能执行下面的语句,之前线程操作时是使用Thread.join方法进行等待,CountDownLatch内部使用了AQS锁,前面已经讲述过AQS的内部结构,其实内部有一个state字段,通过该字段来控制锁的操作,CountDownLatch是如何控制多个线程执行都执行结束?其实CountDownLatch内部是将stat原创 2021-06-16 07:41:21 · 549 阅读 · 1 评论 -
CyclicBarrier原理详解
介绍一种同步辅助工具,允许一组线程都等待彼此到达一个共同的障碍点。这个屏障被称为循环,因为它可以在等待的线程被释放后重新使用,之前分析过CountDownLatch,下面说一下两者的区别:CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后(这N个线程并不相互等待,谁先完成都可以)才能执行。CyclicBarrier : N个线程相互等待,任何一个线程没有到达或完成时,所有的线程都必须互相等待通过一个简单的例子来理解一下CyclicBarrier,例原创 2021-06-15 14:53:46 · 992 阅读 · 0 评论 -
SynchronousQueue原理详解-非公平模式
开篇说明:本文分析采用的是jdk1.8约定:下面内容中Ref-xxx代表的是引用地址,引用对应的节点前面已经讲解了公平模式的内容,今天来讲解下关于非公平模式下的SynchronousQueue是如何进行工作的,在源码分析的时候,先来简单看一下非公平模式的简单原理,它采用的栈这种FILO先进后出的方式进行非公平处理,它内部有三种状态,分别是REQUEST,DATA,FULFILLING,其中REQUEST代表的数据请求的操作也就是take操作,而DATA表示的是数据也就是Put操作将数据存放到栈中,原创 2021-06-15 14:51:57 · 300 阅读 · 0 评论 -
图解Java线程池原理
什么是线程池?为了避免频繁重复的创建和销毁线程,我们可以让这些线程进行复用,在线程池中,总会有活跃的线程在占用,但是线程池中也会存在没有占用的线程,这些线程处于空闲状态,当有任务的时候会从池子里面拿去一个线程来进行使用,当完成工作后,并没有销毁线程,而是将线程放回到池子中去。线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供很好的性能。二是线程池提供了一种资源限制和管理的手段,比如可以限制现成的个数,动态新增线程等。原创 2021-06-15 14:51:04 · 1771 阅读 · 6 评论 -
SynchronousQueue原理详解-公平模式
一、介绍SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对SynchronousQueue的读操作,反之亦然。一个读操作需要等待一个写操作,相当于是交换通道,提供者和消费者是需要组队完成工作,缺少一个将会阻塞线程,知道等到配对为止。SynchronousQueue是一个队列和栈算法实现,在SynchronousQueue中双队列FIFO提供公平模式,而双栈LIFO提供的则是非公平模式。对于SynchronousQueue来原创 2021-06-15 14:50:22 · 597 阅读 · 1 评论 -
图解Semaphore信号量之AQS共享锁-非公平模式
介绍之前我们已经讲解过关于AQS的独占锁,这一章节主要讲解AQS的共享锁,以Semaphore信号量来进行讲解,相信通过看了本章节内容的同学可以对AQS的共享模式有一个了解,Semaphore信号量提供了用于控制资源同时被访问的个数,也就是它会维护一个许可证,访问资源之前需要申请许可证,申请许可证成功后才可以进行访问,如果申请访问资源获取的了许可证,则可以进行资源访问,同时颁发许可证中心的许可证会进行增加,等到访问资源的线程释放资源后,许可证使用情况会进行减少。例子public class Semap原创 2021-06-15 14:49:43 · 274 阅读 · 0 评论 -
浅析PriorityBlockingQueue优先级队列原理
介绍当你看本文时,需要具备以下知识点二叉树、完全二叉树、二叉堆、二叉树的表示方法如果上述内容不懂也没关系可以先看概念。PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,虽然指定了数组的长度,但是可以无限的扩充,直到资源消耗尽为止,每次出队都返回优先级别最高的或者最低的元素。其实内部是由平衡二叉树堆来进行排序的,先进行构造二叉树堆,二叉树堆排序出来的数每次第一个元素和最后一个元素进行交换,这样最大的或最小的数就到了最后面,然后最后一个不变,重新构原创 2021-06-15 14:48:48 · 529 阅读 · 0 评论 -
DelayQueue延迟队列原理剖析
介绍DelayQueue队列是一个延迟队列,DelayQueue中存放的元素必须实现Delayed接口的元素,实现接口后相当于是每个元素都有个过期时间,当队列进行take获取元素时,先要判断元素有没有过期,只有过期的元素才能出队操作,没有过期的队列需要等待剩余过期时间才能进行出队操作。源码分析DelayQueue队列内部使用了PriorityQueue优先队列来进行存放数据,它采用的是二叉堆进行的优先队列,使用ReentrantLock锁来控制线程同步,由于内部元素是采用的PriorityQueue来原创 2021-06-15 14:48:04 · 538 阅读 · 0 评论 -
LinkedBlockingQueue原理详解
简述前面已经介绍过关于ArrayBlockingQueue相关原理性内容,我们前面讲过ArrayBlockingQueue是基于数组的方式实现的,那么LinkedBlockingQueue是基于链表的形式实现。先来看一下LinkedBlockingQueue的UML,如下所示:通过上面的UML可以看到,他也是BlockingQueue的实现,也就是他的核心在于Blocking(阻塞)这个上面,在讲解ArrayBlockingQueue的时候,可以清晰的得出ArrayBlockingQueue是使用了独原创 2021-06-15 14:44:51 · 2054 阅读 · 1 评论 -
ArrayBlockingQueue原理详解
介绍ArrayBlockingQueue是基于数组实现的共享通道,为什么说是共享通道,假说线程A希望给线程B发一个消息,用什么方式来告知线程B是比较合适的呢?可以使用BlockingQueue来实现。通过上图中的继承关系我们可以清晰的发现ArrayBlockingQueue是BlockingQueue接口的实现,通过名称可以得出它是基于数组实现的,所以更适合做有界的队列。刚才也提到过它是作为数据共享来进行的线程间数据的传递,那么问题来了,当队列中为空的时候消费队列的线程如何知道队列中有新的元素添加进原创 2021-06-15 14:45:36 · 1400 阅读 · 2 评论