Fork/Join框架理解

摘要

Fork/Join任务适合用来处理需要递归处理的任务。整个流程是,将大任务递归分解成若干个小任务,直到任务足够小后停止分割,最后多个线程并发执行所有小任务,最后将这些任务结果进行汇总成最终的结果。JDK用来执行Fork/Join任务的工作线程池大小等于CPU核心数。在一个4核CPU上,最多可以同时执行4个子任务。


 RejectedExecutionException抛出的原因

场景描述

当一个真实场景是Executor提交所有任务进行计算,然后接着调用shutdown方法,最后调用awaitTermination方法等待所有任务计算结束。偶尔会出现RejectedExecutionException异常。


 多线程-系列文章目录以及思维导图

多线程并发系列文章目录


 多线程-性能

性能

多线程并发的优势可以提高程序性能,但增加了线程之间的协调(加锁、触发信号以及内存同步)、增加上下文切换线程的创建和销毁以及线程的调度等时间 。性能衡量的单位非服务时间,而是吞吐量和伸缩性.


 多线程-取消与关闭

取消与关闭

​ 对中断操作的正确理解是:它并不会真正的中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己。(这些时刻也被称为取消点)。有些方法,例如wait、sleep和join等,将严格的处理这种请求,当它们收到中断请求或者在开始执行时发现某个已被设置好的中断状态时,将抛出一个异常。设计良好的方法可以完全忽略这种请求,只要它们能使调用代码对中断请求进行某种处理。设计糟糕的方法可能会屏蔽中断请求,从而导致调用栈中的其它代码无法对中断请求做出响应!通常中断是取消的最合理的方式


 多线程-锁介绍

死锁

在多线程开发中,经常性需要用锁控制避免发生线程不安全。虽然能够控制线程安全,但是在使用过程中也会发生死锁的情况。最常见的两种情况,第一种情况是加锁顺序不同情况下,可能会造成相互锁住对方,从而导致顺序死锁。第二种在线程池或者信号量来限制对线程的使用,也会造成资源死锁或者饥饿发生。


 多线程-CAS-非阻塞同步机制

在多线程并发中,为了追求线程的安全性,我们都会选择一些同步的机制。例如最常见的锁Synchronized,但这属于重量级锁,当竞争激烈时会引起性能问题。而Volatile利用内存可见性可以保证线程安全,但有一定的局限性只能用于修饰变量。那有没有一种同步机制即轻量且性能较高的? 那就是今天的主角-CAS


 多线程-线程池

Executor框架

是一个实现线程池的接口,也是为了灵活且强大的异步任务执行框架提供基础。将任务提交过程与执行过程解耦开来。管理线程任务的生命周期。提供了统计信息的收集、应用程序管理机制和性能监视机制。


 多线程-基础构建模块

并发容器类

java1.5增加了一些并发容器工具类,如果ConcurrentHashMap、CopyAndWriteArrayList、BlockingQueue、ConcurrentLinkedQueue、PriorityQueue。java6增加了Deque和BlockingDeque。增加这些并发容器类是用来弥补并发情况下,同步容器带来的线程不安全的问题。最常见当并发迭代时另外一个线程修改了容器里的值,造成快速失败(fail-fast),这时就会抛出ConcurrentModificationException异常。其中有一些隐藏的方法也会间接触发迭代操作,比如equals和hashCode方法。


 多线程并发编程实践-基础篇

什么是线程安全?

原文如下:

a class is threadsafe when it continues to behave correctly when accessed from
multiple threads.

翻译为:当多个线程并发访问时确保与单线程访问该类一样正确。称为线程安全


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×