今天学习CopyOnWriteArrayList。CopyOnWriteArrayList可以看做是线程安全的ArrayList,所有的写操作都是通过对底层数组进行一次新的复制实现的,这种思想称为“写时复制”,CopyO…
标签:java并发
Java并发编程札记-(五)JUC容器-06LinkedBlockingDeque
LinkedBlockingDeque是一个基于链表的、可指定大小的阻塞双端队列。“双端队列”意味着可以操作队列的头尾两端,所以LinkedBlockingDeque既支持FIFO,也支持FILO。 可选的容量范围构造方…
显式锁(第十三章)
显式锁 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。Java5.0增加了一种新的机制:ReentrantLock。ReentrantLock并不是一种替代内…
任务执行(第六章)
任务执行 任务边界:当围绕“任务执行”来设计应用程序时,第一步就是要找出清晰的任务边界。 1.为每个任务创建一个线程的风险: 线程生命周期的开销非常高:线程的创建于销毁 资源消耗:活跃的线程会消耗系统资源,尤其是内存。如…
Java并发编程札记-(三)JUC原子类-07CAS
CAS,即compare and swap,比较并交换。CAS操作包含三个操作数:内存值(V),预期值(A)、新值(B)。如果内存值与预期值相同,就将内存值修改为新值,否则不做任何操作。 java.util.concur…
Java并发编程札记-(七)JUC工具类-01概述
今天学习JUC中的工具类。 CountDownLatch CountDownLatch是一个通用同步器,用于同步一个或多个任务。在完成一组正在其他线程中执行的任务之前,它允许一个或多个线程一直等待。 CyclicBarr…
线程池的使用(第八章)
线程池的使用 Executor框架可以将任务的提交与任务的执行策略解耦开来。并非所有的任务都使用所有的执行策略,有些任务需要明确的指定执行策略,包括: 依赖性任务:提交给线程池的任务需要依赖其他的任务,那么就隐含地给执行…
Java并发编程札记-(四)JUC锁-04Condition简介
我们已经学习了如何通过使用锁来同步两个任务,但为了解决某个问题,任务之间只有互斥是不够的,还需要相互通信,相互协作。今天就来学习如何实现任务之间的协作。 初识Condition 在任务协作中,关键问题是任务之间的通信。握…
Java并发编程札记-(二)JUC概述
从今天开始学习JUC。JUC是java.util.concurrent包的简称。下图是JUC的整体结构。 atomic 以下是JUC中的原子类。 locks 以下是JUC中的锁,也称显示锁。 collections 以下…
Java并发编程札记-(四)JUC锁-09CyclicBarrier
CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点。如果你希望一组并行的任务在下个步骤之前相互等待,直到所有的任务都完成了下个步骤前的所有操作,才继续向前执行,那么CyclicBarrier很合适。 …
Java并发编程札记-(四)JUC锁-10Semaphore简介
一般的锁在任意时刻只允许一个线程访问一项资源,而计数信号量允许n个任务同时访问一项资源。我们可以将信号量看做一个许可集,可以向线程分发使用资源的许可证。获得资源前,线程调用acquire()从许可集中获取许可。该线程结束…
聊聊并发(八)——Fork/Join框架介绍
本文首发于InfoQ 1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通…