CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点。如果你希望一组并行的任务在下个步骤之前相互等待,直到所有的任务都完成了下个步骤前的所有操作,才继续向前执行,那么CyclicBarrier很合适。 …
标签:java并发
Java并发编程札记-(五)JUC容器-01概述
今天开始学习JUC容器。JUC提供了用于多线程上下文中的Collection实现与高效的、可伸缩的、线程安全的非阻塞FIFO队列。参考JDK1.8,画出下图。 List JUC容器中List的实现只有CopyOnWrit…
Java并发编程札记-(四)JUC锁-10Semaphore简介
一般的锁在任意时刻只允许一个线程访问一项资源,而计数信号量允许n个任务同时访问一项资源。我们可以将信号量看做一个许可集,可以向线程分发使用资源的许可证。获得资源前,线程调用acquire()从许可集中获取许可。该线程结束…
Java并发编程札记-(五)JUC容器-02CopyOnWrite
今天学习CopyOnWriteArrayList。CopyOnWriteArrayList可以看做是线程安全的ArrayList,所有的写操作都是通过对底层数组进行一次新的复制实现的,这种思想称为“写时复制”,CopyO…
Java并发编程札记-(五)JUC容器-03ConcurrentHashMap
今天来学习ConcurrentHashMap在JDK1.8中的实现。相比JDK1.7,JDK1.8中ConcurrentHashMap的实现有很大的不同。 结构 先来看下JDK1.7与JDK1.8中ConcurrentH…
Java并发编程札记-(五)JUC容器-04ConcurrentSkipListMap
ConcurrentSkipListMap是线程安全的有序的哈希表。与同是有序的哈希表TreeMap相比,ConcurrentSkipListMap是线程安全的,TreeMap则不是,且ConcurrentSkipLis…
Java并发编程札记-(五)JUC容器-05ArrayBlockingQueue与LinkedBlockingQueue
今天来学习ArrayBlockingQueue与LinkedBlockingQueue。 ArrayBlockingQueue是一个基于数组的有界阻塞队列。“有界”表示数组容量是固定的。这是一个典型的“有界缓存区”,固定…
Java并发编程札记-(五)JUC容器-06LinkedBlockingDeque
LinkedBlockingDeque是一个基于链表的、可指定大小的阻塞双端队列。“双端队列”意味着可以操作队列的头尾两端,所以LinkedBlockingDeque既支持FIFO,也支持FILO。 可选的容量范围构造方…
Java并发编程札记-(五)JUC容器-07ConcurrentLinkedQueue
ConcurrentLinkedQueue是一个基于链表的、无界的、线程安全的队列。此队列按照FIFO原则对元素进行排序。此队列不允许使用null元素,采用了有效的“无等待(wait-free)”算法(CAS算法)。 与…
Java并发编程札记-(六)JUC线程池-01概述
前面的例子中总是需要线程时就创建,不需要就销毁它。但频繁创建和销毁线程是很耗资源的,在并发量较高的情况下频繁创建和销毁线程会降低系统的效率。线程池可以通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 参考JDK1.…
Java并发编程札记-(六)JUC线程池-02ThreadPoolExecutor实现原理
本文通过学习ThreadPoolExecutor源码来学习线程池的实现原理。 简介 为什么要使用线程池 许多服务器都面临着处理大量客户端远程请求的压力,如果每收到一个请求,就创建一个线程来处理,表面看是没有问题的,但实际…
聊聊并发(八)——Fork/Join框架介绍
本文首发于InfoQ 1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通…