并发&多线程
文章平均质量分 89
蜀中孤鹰
心之所向,倾力达之。
展开
-
forkjoinpool源码分析
ForkJoinPool是用于执行ForkJoinTask任务的ExecutorService。 ForkJoinPool不仅提供了来自非ForkJoinTask任务提交的入口,另外还提供相关的管理和监控。ForkJoinPool与其他类型的ExecutorService的不同之处主要在于,它采用了工作窃取算法:池中的所有线程都会尝试查找并执行池中的任务或由其他活动任务所创建的任务(如果不存在,则需要阻塞等待) 。当大量任务产生其他子任务时(大多数ForkJoinTask就是如此)及外部提交者向池中提交大原创 2022-01-10 11:46:37 · 1839 阅读 · 0 评论 -
原子更新引用AtomicReference实现原理分析
1 前言原子更新基本类型只能更新单个变量,而原子更新引用类型可以原子更新多个变量。Atomic包提供了以下3个类。AtomicReference:原子更新引用类型。AtomicReferenceFieldUpdater:原子更新引用类型里的字段。AtomicMarkableReference:原子更新带有标记位的引用类型(可以原子更新一个布尔类型的标记位和引用类型。)。现在先来看看AtomicReference是如何实现的(基于JDK1.8)2 实现过程分析主要字段private sta原创 2020-06-28 03:11:54 · 1484 阅读 · 5 评论 -
原子数组AtomicIntegerArray实现原理简析
1 前言JDK官方提供了3个原子数组,它们提供了原子更新数组中元素的能力,它们主要借助Unsafe类实现其核心功能。AtomicIntegerArray:原子更新整型数组里的元素AtomicLongArray:原子更新长整型数组里的元素。AtomicReferenceArray:原子更新引用类型数组里的元素。在分析原子数组之前,我们先来了解Java对象的内存布局,Java对象由对象头和实例数据两部分组成。下图中MarkWord包含对象的hashCode、锁信息、垃圾回收的分代信息原创 2020-06-21 02:17:45 · 1104 阅读 · 0 评论 -
多线程数据交换工具Exchanger完全解析
1 前言Exchanger(交换者)是一个用于线程间协作的工具类, 它可以在配对线程中配对并交换数据。每个线程都可以在exchange入口方法上携带数据,然后与相应的线程进行匹配,并在返回时接收配对线程的数据。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。交换器可能在遗原创 2020-06-01 01:50:35 · 821 阅读 · 0 评论 -
信号量Semaphore深入解读
1 简介Semaphore可翻译为信号量,它维护一组许可证, 每次尝试获取许可证时都将阻塞等待直到可获取,它才能获取到并解除阻塞状态。 Semaphore可以控制一些物理或逻辑资源的访问或使用,它常常用于限制线程数目。在实际开发中,可用作流量控制,特别对于一些公共资源有限的应用场景,如数据库连接,或是一些其他限流的缓存池。(基于JDK1.8)2 示例这是一个使用信号量控制对缓存池缓存中items访问的示例。public class SemaphoreDemo { static class P原创 2020-05-25 01:26:47 · 426 阅读 · 0 评论 -
CyclicBarrier源码深入剖析
1 前言CyclicBarrier是一种同步工具,它允许一组线程在到达一个公共的屏障点时阻塞等待,直到最后一个线程到达屏障点,屏障才能开启,此时所有被阻塞线程才能被唤醒从而继续执行。CyclicBarrier是一个可循环利用(cyclic)的的屏障(barrier),与CountDownLatcher相比的不同之处在于,它可以重置屏障的次数,它可以在释放等待线程之后重新使用。(基于JDK1.8)2 用法示例CyclicBarrier默认的构造方法是CyclicBarrier(int parties),原创 2020-05-17 22:45:09 · 257 阅读 · 0 评论 -
倒数闩锁CountDownLatch源码浅析
1 前言CountDownLatch是一种同步辅助工具类,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。(源码分析基于JDK1.8)CountDownLatch需要用给定的闩锁计数count初始化。await方法使当前线程阻塞(每执行一次countDown方法就将闩锁计数减1),直到闩锁计数达到零时(所有因此阻塞等待的线程都)才会被唤醒。CountDownLatch是一次性使用的同步工具,闩锁计数无法重置,如果需要重置计数,可能使用CyclicBarrier更合适。2 用法示例原创 2020-05-11 23:18:34 · 209 阅读 · 0 评论 -
原子类AtomicInteger实现浅析
1 前言在多线程程序中,如果多个线程同时更新一个共享变量,可能会出现预料之外的奇怪的值。普通的变量无法在多线程下做到可见性、一致性、原子性,也就无法保证线程安全。在JDK的java.util.concurrent.atomic包中提供许多原子操作类,它们可以简单、 高效、安全地更新一个变量。现在介绍其中的基本类型的原子操作类。基本数据类型有boolean 、 char 、 byte 、 sho...原创 2020-05-06 21:26:39 · 328 阅读 · 0 评论 -
双端阻塞队列LinkedBlockingDeque源码深入解析
1 前言与普通队列相比,阻塞队列另外支持两个附加操作,这两个附加的操作支持阻塞的插入和移除方法。①支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。②支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。一般的阻塞队列相比,只能在“尾部入队、在头部出队”,而双端阻塞队列,在头部和尾部均能入队,在头部和尾部均能出队。LinkedBlockingDeq...原创 2020-04-22 11:43:05 · 387 阅读 · 0 评论 -
阻塞队列LinkedBlockingQueue源码深入剖析
1 前言与普通队列相比,阻塞队列另外支持两个附加操作,这两个附加的操作支持阻塞的插入和移除方法。①支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。②支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。LinkedBlockingQueue继承于抽象类AbstractQueue,并实现了BlockingQueue接口。它内部主要使用两个”条件“来实...原创 2020-04-20 12:22:56 · 261 阅读 · 0 评论 -
ArrayBlockingQueue核心源码解读
1 前言队列是一种在尾部添加元素、从头部删除元素的数据结构,而阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。①支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。②支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费...原创 2020-04-13 21:52:09 · 227 阅读 · 0 评论 -
定时任务执行器ScheduledThreadPoolExecutor源码完整解读
目录1 前言2 静态内部类DelayedWorkQueue3 成员内部类ScheduledFutureTask1) 成员变量2) 构造方法3) 方法(1) getDelay(TimeUnit)(2) compareTo(Delayed)(3) isPeriodic()(4) setNextRunTime()(4) cancel(boolean)(5) run()4 构造方法与字段5 主要方法1) ...原创 2020-04-05 19:36:03 · 1535 阅读 · 0 评论 -
线程池执行器ThreadPoolExecutor源码完整解读
1 前言ThreadPoolExecutor的基本概念和用法已经在之前的文章线程池ThreadPoolExecutor简介 、Executor框架完整解读中做过详细的说明,这里主要基于JDK1.8对ThreadPoolExecutor从源码级别分析其实现原理。ThreadPoolExecutor是ExecutorService的最重要的实现类,ThreadPoolExecutor不直接实现Ex...原创 2020-03-30 23:45:25 · 1087 阅读 · 0 评论 -
Executor框架完整解读
目录1 前言2 Executor框架组成3 Runnable和Callable4 ThreadPoolExecutor1) 固定线程池2) 单线程池3) 缓存线程池5 ScheduledThreadPoolExecutor6 Future1 前言Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由...原创 2020-03-27 01:02:08 · 587 阅读 · 0 评论 -
线程池执行器ThreadPoolExecutor概述
1 前言线程池是并发编程中一个重要的概念和技术。大多数异步或并发执行任务都会用到线程池。 线程池,正如其名,它是有一定数量的线程的池子,它会执行被提交过来的任务,执行完一个任务后不会马上结束,它们会继续等待或执行新的任务。线程池有两个重要的概念一个是任务队列,另一个是工作者线程 。任务队列是存放任务的容器,工作者线程会依次不断地到队列中获取任务并执行。线程池有这些优点:①减少系统...原创 2020-03-24 23:13:19 · 467 阅读 · 0 评论 -
AbstractExecutorService源码完全解析
AbstractExecutorService源码完全解析1 前言之前的文章[异步任务执行器简介]对ExecutorService有过简单的介绍,AbstractExecutorService是一个实现ExecutorService接口的非常重要的抽象类,它提供了ExecutorService接口的默认实现。一般情况下,我们可直接继承AbstractExecutorService来实现自己的任...原创 2020-03-22 15:38:00 · 588 阅读 · 1 评论 -
Fork/Join框架基本说明
目录1 引子2 使用Fork/Join框架1) 步骤2) 用例3 Fork/Join框架的异常处理4 Fork/Join框架的实现原理1) ForkJoinTask的fork方法实现原理2) ForkJoinTask的join方法实现原理1 引子Fork/Join框架是从Java1.7开始提供的一个并行处理任务的框架(本篇博客基于JDK1.8分析),它的基本思路是将一个大任务分解成若干个小任务...原创 2020-03-21 20:40:18 · 584 阅读 · 0 评论 -
FutureTask源码完整解读
文章目录1 简介2 用法示例3 实现原理1) 成员变量2) 构造方法3) 主要API(1) run与runAndReset(2) get方法(3) cancel方法(4) 其他辅助方法1 简介上一篇博客“异步任务服务简介”对FutureTask做过简要介绍与分析,这里再次对FutureTask做一次深入的分析(基于JDK1.8)。FutureTask同时实现了Future 、Runnable...原创 2020-03-13 01:29:30 · 417 阅读 · 0 评论 -
异步任务执行器Executor简介
文章目录1.基本接口1)Executor接口2)Future接口2.用法示例3.基本原理1)ExecutorService实现2)Future实现以前线程Thread既表示执行的任务,又表示执行的机制。在JDK1.5中,java并发框架提供了一种“执行服务”的相关API,它将"任务的执行"和"任务的提交“相分离,”执行服务“封装了任务执行的细节,对于任务提交者来说,它可进一步聚焦于任务本身,如任...原创 2020-03-12 00:27:24 · 830 阅读 · 0 评论 -
并发编程中常用的阻塞队列概述
文章目录1.简介2.阻塞队列分类3.阻塞队列详述1)普通阻塞队列2)优先级阻塞队列3)延时阻塞队列4)其他阻塞队列1.简介阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。...原创 2020-03-08 16:42:56 · 356 阅读 · 0 评论 -
无界非阻塞队列ConcurrentLinkedQueue核心源码浅析
文章目录1.简介2.组成1)静态内部类Node2)成员变量3)构造方法3.主要API1)入队2)出队3)移除特定的元素4)获取元素个数1.简介并发编程中,常用到线程安全队列。实现安全队列有两种方式,一种是阻塞算法,另一种是非阻塞算法。阻塞算法一般会使用阻塞锁来实现,非阻塞算法会使用自旋锁(CAS循环)来实现。ConcurrentLinkedQueue是非阻塞线程安全队列,这是一个基于单向链表...原创 2020-03-07 21:05:23 · 437 阅读 · 0 评论 -
StampedLock主要API实现浅析
1.引子StampedLock类,在JDK1.8引入,是对ReenrantReadWriteLock的补充增强,它不是依赖AQS框架实现的锁,但还是等待队列这种并发实现机制,和ReenrantReadWriteLock有很多相似之处。StampedLock增加了一些新的功能,如读/写锁的转换、还能实现乐观锁,在竞争少的情况下能提高并发的性能。如果能熟练灵活使用,搭配其他并发组件,可提高系统性能...原创 2020-03-01 00:15:47 · 619 阅读 · 0 评论 -
ConcurrentHashMap核心源码浅析
1.引子并发编程中使用HashMap可能导致程序死循环。因为多线程会put方法添加键值对时将导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry。另外Hashtable只是简单地使用阻塞式锁(synchronized关键字)来保证线程安全,在并发编程中使用HashTable效率较低。基于此,Concurre...原创 2020-02-27 23:35:25 · 668 阅读 · 1 评论 -
读写锁ReentrantReadWriteLock源代码浅析
1.简介并发中常用的ReentrantLock,是一种典型的排他锁,这类锁在同一时刻只允许一个线程进行访问,实际上将并行操作变成了串行操作。在并发量大的业务中,其整体效率、吞吐量不能满足实现的需要。而且实际的业务中一般情况是读多于写,多个线程读操作不会改变已经有的数据,不会有数据的一致性问题,而一个写操作就会改变数据,其他的的读操作就可能读到过期的数据。读写锁正是为了这种业务需求而产生的,读写锁...原创 2020-02-15 14:41:15 · 240 阅读 · 0 评论 -
可重入排他锁ReentrantLock源码浅析
1.引子"ReentrantLock"单词中的“Reentrant”就是“重入”的意思,正如其名,ReentrantLock是一个支持重入的排他锁,即同一个线程中可以多次获得同步状态,常表现为lock()方法的嵌套使用(类似于synchronized代码类嵌套),而在AQS类注释的使用说明中的Mutex是一个不可重入的锁,只要一个线程获得了同步状态,再次tryAcquire(int)返回fa...原创 2020-02-09 22:20:00 · 332 阅读 · 0 评论 -
Java底层魔术类Unsafe用法简述
1 引子Java中没有指针,不能直接对内存地址的变量进行控制,但Java提供了一个特殊的类Unsafe工具类来间接实现。Unsafe主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用 。正如其名字unsafe,直接去使用这个工具类是不安全的,它能直接在硬件层(内存上)修...原创 2020-01-23 10:12:00 · 807 阅读 · 0 评论 -
ConditionObject源码浅析
1.引子2. Condition接口中的抽象方法用法说明3 Condition用法示例4 条件队列结构5 等待——休眠6 通知——唤醒1.引子任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchro...原创 2020-01-20 21:43:00 · 404 阅读 · 0 评论 -
Java并发基础类AbstractQueuedSynchronizer实现原理
1.引子2.同步器的基本用法3.AQS中的同步队列4.静态内部类Node的组成4.1Node的成员变量4.2Node的静态常量4.2Node的构造方法5.独占锁的同步状态的获取与释放5.1 获取同步状态5.2 可中断地获取同步状态5.3 超时获取同步状态5.4释放同步状态5.5 小结6.共享锁的同步状态的获取与释放6.1...原创 2020-01-13 22:33:00 · 678 阅读 · 0 评论 -
Lock接口简介
1.引子锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源,解决数据的一致性问题。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了...原创 2020-01-13 22:03:00 · 384 阅读 · 0 评论