
并发工具篇
文章平均质量分 95
柳成荫0529
这个作者很懒,什么都没留下…
展开
-
计划任务
自JDK 1.5 开始,JDK提供了ScheduledThreadPoolExecutor类用于计划任务(又称定时任务),这个类有两个用途:在给定的延迟之后运行任务周期性重复执行任务在这之前,是使用Timer类来完成定时任务的,但是Timer有缺陷:Timer是单线程模式;如果在执行任务期间某个TimerTask耗时较久,那么就会影响其它任务的调度;Timer的任务调度是基于绝对时间的,对系统时间敏感;Timer不会捕获执行TimerTask时所抛出的异常,由于Timer是单线程,所以一原创 2021-01-03 19:58:09 · 285 阅读 · 0 评论 -
Java 8 Stream并行计算原理
Java 8 Stream简介从Java 8 开始,我们可以使用Stream接口以及lambda表达式进行“流式计算”。它可以让我们对集合的操作更加简洁、更加可读、更加高效。Stream接口有非常多用于集合计算的方法,比如判空操作empty、过滤操作filter、求最max值、查找操作findFirst和findAny等等。Stream单线程串行计算Stream接口默认是使用串行的方式,也就是说在一个线程里执行。下面举一个例子:public class StreamDemo { publi原创 2021-01-03 19:57:33 · 793 阅读 · 0 评论 -
Fork/Join框架
什么是Fork/JoinFork/Join框架是一个实现了ExecutorService接口的多线程处理器,它专为那些可以通过递归分解成更细小的任务而设计,最大化的利用多核处理器来提高应用程序的性能。与其他ExecutorService相关的实现相同的是,Fork/Join框架会将任务分配给线程池中的线程。而与之不同的是,Fork/Join框架在执行任务时使用了工作窃取算法。fork在英文里有分叉的意思,join在英文里连接、结合的意思。顾名思义,fork就是要使一个大任务分解成若干个小任务,而joi原创 2021-01-03 19:56:19 · 262 阅读 · 0 评论 -
通信工具类
JDK中提供了一些工具类以供开发者使用。这样的话我们在遇到一些常见的应用场景时就可以使用这些工具类,而不用自己再重复造轮子了。它们都在java.util.concurrent包下。先总体概括一下都有哪些工具类,它们有什么作用,然后再分别介绍它们的主要使用方法和原理。类作用Semaphore限制线程的数量Exchanger两个线程交换数据CountDownLatch线程等待直到计数器减为0时开始工作CyclicBarrier作用跟CountDownLatch类原创 2021-01-03 19:55:19 · 169 阅读 · 0 评论 -
CopyOnWrite容器
什么是CopyOnWrite容器在说到CopyOnWrite容器之前我们先来谈谈什么是CopyOnWrite机制,CopyOnWrite是计算机设计领域中的一种优化策略,也是一种在并发场景下常用的设计思想——写入时复制思想。那什么是写入时复制思想呢?就是当有多个调用者同时去请求一个资源数据的时候,有一个调用者出于某些原因需要对当前的数据源进行修改,这个时候系统将会复制一个当前数据源的副本给调用者修改。CopyOnWrite容器即写时复制的容器,当我们往一个容器中添加元素的时候,不直接往容器中添加,而是原创 2021-01-03 19:53:56 · 167 阅读 · 0 评论 -
并发容器集合
同步容器与并发容器我们知道在java.util包下提供了一些容器类,而Vector和HashTable是线程安全的容器类,但是这些容器实现同步的方式是通过对方法加锁(sychronized)方式实现的,这样读写均需要锁操作,导致性能低下。而即使是Vector这样线程安全的类,在面对多线程下的复合操作的时候也是需要通过客户端加锁的方式保证原子性。如下面例子说明:public class TestVector { private Vector<String> vector; //方法一原创 2021-01-03 19:53:12 · 256 阅读 · 1 评论 -
锁接口和类
前面我们介绍了Java原生的锁——基于对象的锁,它一般是配合synchronized关键字来使用的。实际上,Java在java.util.concurrent.locks包下,还为我们提供了几个关于锁的类和接口。它们有更强大的功能或更高的性能。synchronized的不足之处我们先来看看synchronized有什么不足之处。如果临界区是只读操作,其实可以多线程一起执行,但使用synchronized的话,同一时间只能有一个线程执行。synchronized无法知道线程有没有成功获取到锁使用s原创 2021-01-03 19:51:51 · 197 阅读 · 0 评论 -
阻塞队列
阻塞队列的由来我们假设一种场景,生产者一直生产资源,消费者一直消费资源,资源存储在一个缓冲池中,生产者将生产的资源存进缓冲池中,消费者从缓冲池中拿到资源进行消费,这就是大名鼎鼎的生产者-消费者模式。该模式能够简化开发过程,一方面消除了生产者类与消费者类之间的代码依赖性,另一方面将生产数据的过程与使用数据的过程解耦简化负载。我们自己coding实现这个模式的时候,因为需要让多个线程操作共享变量(即资源),所以很容易引发线程安全问题,造成重复消费和死锁,尤其是生产者和消费者存在多个的情况。另外,当缓冲池空原创 2021-01-03 19:50:38 · 212 阅读 · 0 评论 -
线程池原理
为什么要使用线程池使用线程池主要有以下三个原因:创建/销毁线程需要消耗系统资源,线程池可以复用已创建的线程。控制并发的数量。并发数量过多,可能会导致资源消耗过多,从而造成服务器崩溃。(主要原因)可以对线程做统一管理。线程池的原理Java中的线程池顶层接口是Executor接口,ThreadPoolExecutor是这个接口的实现类。我们先看看ThreadPoolExecutor类。ThreadPoolExecutor提供的构造方法一共有四个构造方法:// 五个参数的构造函数publ原创 2021-01-03 19:47:48 · 417 阅读 · 1 评论