阻塞队列:
ArrayBlockQueue和LinkedBlockQueue的区别:
两者在锁上有区别
ArrayBlockQueue的生产者和消费者公用同一把锁 ,并且初始化时要制定容量大小,并且ArrayBlockQueue的数据结构是数组.
LinkedBlockQueue的生产者和消费者用的不同的锁, LinkedBlockQueue的数据结构是链表
跳表
其实跳表应该放在ConcurrentHashMap里的, 依旧先上大神博客链接,后续我再借鉴整理
线程池
为什么要用线程池?
- 降低资源消耗,提升复用性
- 提高响应速度
- 提高线程的可管理性
- 控制线程的数量
任务特性:
CPU密集型 : 机器CPU核心数+1
IO密集型(磁盘,网络,数据库): 机器核心数+2
混合型(CPU密集,IO密集): 尽量拆分两个线程池. 如果两种任务的任务时间相差太大,那么拆分的必要性就不大了
可以通过Runtime.getRuntime.availbleProcessors() 来获取CPU逻辑核心数.
线程池的阻塞队列一般禁止使用无界队列.
例子:
比如高并发的数据库访问, 如果使用无界队列, 容易造成OOM, 整个系统都会崩溃. 而用有界可以避免这种情况.
线程池的重点:
- 如何合理配置线程池
- 线程池的参数对线程池工作机制的影响. 包括各个参数的含义.
上大神链接: