随笔分类 - 多线程&&并发
摘要:1 前言 原子更新基本类型只能更新单个变量,而原子更新引用类型可以原子更新多个变量。Atomic包提供了以下3个类。 AtomicReference:原子更新引用类型。 AtomicReferenceFieldUpdater:原子更新引用类型里的字段。 AtomicMarkableReference
阅读全文
摘要:1 前言 JDK官方提供了3个原子数组,它们提供了原子更新数组中元素的能力,它们主要借助Unsafe类实现其核心功能。 AtomicIntegerArray:原子更新整型数组里的元素 AtomicLongArray:原子更新长整型数组里的元素。 AtomicReferenceArray:原子更新引用
阅读全文
摘要:1 前言 Exchanger(交换者)是一个用于线程间协作的工具类, 它可以在配对线程中配对并交换数据。每个线程都可以在exchange入口方法上携带数据,然后与相应的线程进行匹配,并在返回时接收配对线程的数据。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchang
阅读全文
摘要:1 简介 Semaphore可翻译为信号量,它维护一组许可证, 每次尝试获取许可证时都将阻塞等待直到可获取,它才能获取到并解除阻塞状态。 Semaphore可以控制一些物理或逻辑资源的访问或使用,它常常用于限制线程数目。在实际开发中,可用作流量控制,特别对于一些公共资源有限的应用场景,如数据库连接,
阅读全文
摘要:1 前言 CyclicBarrier是一种同步工具,它允许一组线程在到达一个公共的屏障点时阻塞等待,直到最后一个线程到达屏障点,屏障才能开启,此时所有被阻塞线程才能被唤醒从而继续执行。CyclicBarrier是一个可循环利用(cyclic)的的屏障(barrier),与CountDownLatch
阅读全文
摘要:1 前言 CountDownLatch是一种同步辅助工具类,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。(源码分析基于JDK1.8) CountDownLatch需要用给定的闩锁计数count初始化。await方法使当前线程阻塞(每执行一次countDown方法就将闩锁计数减1
阅读全文
摘要:1 前言 在多线程程序中,如果多个线程同时更新一个共享变量,可能会出现预料之外的奇怪的值。普通的变量无法在多线程下做到可见性、一致性、原子性,也就无法保证线程安全。在JDK的java.util.concurrent.atomic包中提供许多原子操作类,它们可以简单、 高效、安全地更新一个变量。现在介
阅读全文
摘要:1 前言 与普通队列相比,阻塞队列另外支持两个附加操作,这两个附加的操作支持阻塞的插入和移除方法。 ①支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。 ②支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。 一般的阻塞队列相比,只能在“尾部入队、在头部出队”,
阅读全文
摘要:1 前言 与普通队列相比,阻塞队列另外支持两个附加操作,这两个附加的操作支持阻塞的插入和移除方法。 ①支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。 ②支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。 LinkedBlockingQueue继承于抽象类A
阅读全文
摘要:1 前言 队列是一种在尾部添加元素、从头部删除元素的数据结构,而阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 ①支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。 ②支持阻塞的移除方法:在队列为空时,获取元素的线
阅读全文
摘要:1 前言 ScheduledThreadPoolExecutor是定时任务执行器,它可以通过构造方法创建,也可通过工厂类Executors的静态方法创建(本文基于JDK1.8)。 ScheduledThreadPoolExecutor继承自ThreadPoolExecutor,并实现了表示定时执行器
阅读全文
摘要:1 前言 ThreadPoolExecutor的基本概念和用法已经在之前的文章线程池ThreadPoolExecutor简介 、Executor框架完整解读中做过详细的说明,这里主要基于JDK1.8对ThreadPoolExecutor从源码级别分析其实现原理。 ThreadPoolExecutor
阅读全文
摘要:1 前言 Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由Executor框架提供. 在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地
阅读全文
摘要:1 前言 线程池是并发编程中一个重要的概念和技术。大多数异步或并发执行任务都会用到线程池。 线程池,正如其名,它是有一定数量的线程的池子,它会执行被提交过来的任务,执行完一个任务后不会马上结束,它们会继续等待或执行新的任务。线程池有两个重要的概念一个是任务队列,另一个是工作者线程 。任务队列是存放任
阅读全文
摘要:1 前言 之前的文章异步任务执行器简介对ExecutorService有过简单的介绍,AbstractExecutorService是一个实现ExecutorService接口的非常重要的抽象类,它提供了ExecutorService接口的默认实现。一般情况下,我们可直接继承AbstractExec
阅读全文
摘要:1 引子 Fork/Join框架是从Java1.7开始提供的一个并行处理任务的框架(本篇博客基于JDK1.8分析),它的基本思路是将一个大任务分解成若干个小任务,并行处理多个小任务,最后再汇总合并这些小任务的结果便可得到原来的大任务结果。 从字面意思来理解Fork/Join框架,"Fork"表示“分
阅读全文
摘要:1 简介 上一篇博客“异步任务服务简介”对FutureTask做过简要介绍与分析,这里再次对FutureTask做一次深入的分析(基于JDK1.8)。 FutureTask同时实现了Future 、Runnable接口,因此它可以交给执行器Executor去执行这个任务,也可以由调用线程直接执行ru
阅读全文
摘要:以前线程Thread既表示执行的任务,又表示执行的机制。在JDK1.5中,java并发框架提供了一种“执行服务”的相关API,它将"任务的执行"和"任务的提交“相分离,”执行服务“封装了任务执行的细节,对于任务提交者来说,它可进一步聚焦于任务本身,如任务提交、获取任务执行后的结果、取消任务而不需要关
阅读全文
摘要:1.简介 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。 2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于
阅读全文
摘要:1.简介 并发编程中,常用到线程安全队列。实现安全队列有两种方式,一种是阻塞算法,另一种是非阻塞算法。阻塞算法一般会使用阻塞锁来实现,非阻塞算法会使用自旋锁(CAS循环)来实现。 ConcurrentLinkedQueue是非阻塞线程安全队列,这是一个基于单向链表的无界队列,遵守先进先出的排序规则。
阅读全文

浙公网安备 33010602011771号