并发编程之知识梳理 第二部分
你好! 这是我对于Java 并发编程相关知识点的梳理与思考,希望对你能有所帮助;菜鸟萌新,问题多多,欢迎指出,谢谢!(全文链接: 点击在线查看清晰思维导图.)
全文内容
线程池
好处
实现原理
线程池的主要处理流程
ThreadPoolExecutor执行示意图
使用
创建
向线程池提交任务
关闭
合理地配置线程池
线程池的监控
Executor
框架简介
两级调度模型
结构
类与接口
使用示意图
成员
ThreadPoolExecutor
ThreadPoolExecutor执行任务示意图:
CachedThreadPool的execute()的运行示意
CachedThreadPool的任务传递示意图:
ScheduleThreadPoolExecutor
ScheduledThreadPoolExecutor的任务传递示意图:
ScheduledThreadPoolExecutor的任务执行步骤:
FutureTask
FutureTask的设计示意图:
FutureTask的级联唤醒示意图:
容器和框架
ConcurrentHashMap
ConcurrentLinkedQueue
Java中的阻塞队列
Fork/Join框架
是什么?
工作窃取算法
异常处理
并发工具类
CountDownLatch
在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
- 基于AbstractQueuedSynchronizer实现,state初始化为count,每countDown一次减1直到等于0,
- unpark唤醒await线程
重要方法:
- await():调用此方法线程会被阻塞,直到count为0
- await(long timeout, TimeUnit unit):同await(),可以设置最大等待时间,如超过最大等待时间,则不再等待
- countDown():count减1,直至为0
为什么不使用ReentrantLock?
countDown不需要堵塞,只需要在最后一次count=0时去唤醒堵塞的主线程(await),AQS+LockSupport完全够用。
Semaphore
- 计数信号量,用于控制特定资源在同一个时间被访问的个数
- 基于AbstractQueuedSynchronizer实现,支持公平和非公平信号量,默认非公平信号量,state初始化为permits。
CyclicBarrier
- 一个可循环使用(Cyclic)的屏障(Barrier),让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会放行,所有被屏障拦截的线程继续执行。
- 基于ReentrantLock+Condition实现,await后先lock,然后–count,不等于0就执行Condition.await。反之,重置count并执行Condition.signalAll唤醒所有堵塞线程。
重要方法:
- await():在CyclicBarrier上进行阻塞等待,并使count减1
- await(long timeout, TimeUnit unit):在CyclicBarrier上进行限时的阻塞等待,并使count减1,当时间到达限定时间后,线程继续执行
- getParties():获取CyclicBarrier通过屏障的线程数量,也称为方数
- getNumberWaiting():获取正在CyclicBarrier上等待的线程数量
Phaser
Exchanger
原子操作类
引用
[1]: 链接: https://mp.weixin.qq.com/s/-PRq4ChaCkEFB_DJyyKhvg
[2]: 《Java并发编程的艺术》 方腾飞 魏鹏 程晓明
[3]: 《Java并发编程之美》翟陆续,薛宾田