前言
最近稍微闲了一点于是把这个半年都没更新的开源项目 cicada 重新捡了起来。
一些新关注的朋友应该还不知道这项目是干啥的?先来看看官方介绍吧(其实就我自己写的😀)
cicada: 基于 Netty4 实现的快速、轻量级 WEB 框架;没有过多的依赖,核心 jar 包仅
30KB
。
baller
最近稍微闲了一点于是把这个半年都没更新的开源项目 cicada 重新捡了起来。
一些新关注的朋友应该还不知道这项目是干啥的?先来看看官方介绍吧(其实就我自己写的😀)
cicada: 基于 Netty4 实现的快速、轻量级 WEB 框架;没有过多的依赖,核心 jar 包仅
30KB
。
前不久帮同事一起 review
一个 job
执行缓慢的问题时发现不少朋友在撸码实现功能时还是有需要细节不够注意,于是便有了这篇文章。
|
|
首先大家看看这段代码有什么问题嘛?
前几日早上打开邮箱收到一封监控报警邮件:某某 ip 服务器 CPU 负载较高,请研发尽快排查解决,发送时间正好是凌晨。
其实早在去年我也处理过类似的问题,并记录下来:《一次生产 CPU 100% 排查优化实践》
不过本次问题产生的原因却和上次不太一样,大家可以接着往下看。
原以为线程池还挺简单的(平时常用,也分析过原理),这次是想自己动手写一个线程池来更加深入的了解它;但在动手写的过程中落地到细节时发现并没想的那么容易。结合源码对比后确实不得不佩服 Doug Lea
。
我觉得大部分人直接去看 java.util.concurrent.ThreadPoolExecutor
的源码时都是看一个大概,因为其中涉及到了许多细节处理,还有部分 AQS
的内容,所以想要理清楚具体细节并不是那么容易。
在面试过程中聊到并发相关的内容时,不少面试官都喜欢问这类问题:
当 N 个线程同时完成某项任务时,如何知道他们都已经执行完毕了。
这也是本次讨论的话题之一,所以本篇为『并发包入坑指北』的第二篇;来聊聊常见的并发工具。