1.学习切入点 JDK的并发包中提供了几个非常有用的并发工具类. CountDownLatch. CyclicBarrier和 Semaphore工具类提供了一种并发流程控制的手段.本文将介绍CountDownLatch(闭锁)的实现原理.在了解闭锁之前需要先了解AQS,因为CountDownLatch的实现需要依赖于AQS共享锁的实现机制. 官方文档: https://docs.oracle.com/javase/8/docs/api/ 百度翻译如下: 一种同步辅助程序,允许一个或多个线程等待…
前言 JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要的工具,只不过相对而言使用的不多,什么呢? Exchange -- 交换器.用于在两个线程之间交换数据,A 线程将 a 数据交给 B 线程,B 线程将 b 数据交给 a 线程. 具体使用例子参见 并发编程之 线程协作工具类.我们这篇文章就不再讲述如何使用了. 而今天,我们将从源码处分析,Exchange 的实现原理.如果大家看过之前关于 SynchronousQueue 的文章…
前言 Condition 是 Lock 的伴侣,至于如何使用,我们之前也写了一些文章来说,例如 使用 ReentrantLock 和 Condition 实现一个阻塞队列,并发编程之 Java 三把锁, 在这两篇文章中,我们都详细介绍了他们的使用.今天我们就来深入看看源码实现. 构造方法 Condition 接口有 2 个实现类,一个是 AbstractQueuedSynchronizer.ConditionObject,还有一个是 AbstractQueuedLongSynchronizer.…
上期回顾: 上次博客我们主要说了我们juc并发包下面的ReetrantLock的一些简单使用和底层的原理,是如何实现公平锁.非公平锁的.内部的双向链表到底是什么意思,prev和next到底是什么,为什么要引入heap和tail来值向null的Node节点.高并发时候是如何保证state来记录重入锁的,在我们的上次博客都做了详细的说明.这次我们来聊一些简单易懂且实用的AQS中的工具类. Semaphore信号量: 这个东西很简单,别看字面意思,什么信号量,我也不懂得那个术语什么意思,Semapho…
前言 并发 JUC 包提供了很多工具类,比如之前说的 CountDownLatch,CyclicBarrier ,今天说说这个 Semaphore--信号量,关于他的使用请查看往期文章并发编程之 线程协作工具类,今天的任务就是从源码层面分析一下他的原理. 源码分析 如果先不看源码,根据以往我们看过的 CountDownLatch CyclicBarrier 的源码经验来看,Semaphore 会怎么设计呢? 首先,他要实现多个线程线程同时访问一个资源,类似于共享锁,并且,要控制进入资源的线程的数…
前言 Doug Lea 大神在 JUC 包中为我们准备了大量的多线程工具,其中包括 CountDownLatch ,名为倒计时门栓,好像不太好理解.不过,今天的文章之后,我们就彻底理解了. 如何使用? 在 JDK 的文档中,带有 2 个例子,我们使用其中一个,测试代码如下: class Driver2 { public static void main(String[] args) throws InterruptedException { CountDownLatch doneSignal =…
为什么要说AbstractQueuedSynchronizer呢? 因为AbstractQueuedSynchronizer是JUC并发包中锁的底层支持,AbstractQueuedSynchronizer是抽象同步队列,简称AQS,是实现同步器的基础组件,并发包中锁的实现底层就是使用AQS实现,另外大多数人可能不会直接用到AQS, 但是知道其原理对于架构设计还是很有帮助的. 首先我们看一下AQS的类图结构,如下图: 从类图的关系可以看到AQS是一个FIFO的双向队列,内部通过节点head 和…
前言 在之前的介绍 CountDownLatch 的文章中,CountDown 可以实现多个线程协调,在所有指定线程完成后,主线程才执行任务. 但是,CountDownLatch 有个缺陷,这点 JDK 的文档中也说了:他只能使用一次.在有些场合,似乎有些浪费,需要不停的创建 CountDownLatch 实例,JDK 在 CountDownLatch 的文档中向我们介绍了 CyclicBarrier--循环栅栏.具体使用参见文章 并发编程之 线程协作工具类. 源码分析 该类结构如下: 有一个我…
前言 ArrayList 是一个不安全的容器,在多线程调用 add 方法的时候会出现 ArrayIndexOutOfBoundsException 异常,而 Vector 虽然安全,但由于其 add 方法和 get 方法都使用了 synchronized 关键字,导致在并发时的性能令人担忧,因此,伟大的 Doug Lea 编写了 CopyOnWriteArrayList 并发容器,用于替代并发时的 ArrayList,而该类的类名叫 "写的时候拷贝集合".也非常符合他的设计,那么,我们…
## 1 一句话概括ThreadLocal<font face="微软雅黑" size=4>  什么是ThreadLocal?顾名思义:线程本地变量,它为每个使用该对象的线程创建了一个独立的变量副本.</font>## 2 ThreadLocal使用场景<font face="微软雅黑" size=4>  用一句话总结ThreadLocal真的实在是太苍白无力了!我们通过一个简单的例子入手.比如现在有A和B两台服务器需要通过htt…