负载: 所谓CPU负载指的是一段时间内任务队列的长度,通俗的讲,就是一段时间内一共有多少任务在使用或等待使用CPU;
线程池分类:
FixThreadExecutor: 场景是要限制当前线程的数量,适用于负载比较重的服务器;
SingleThreadExecutor: 保证顺序的执行各个任务;
CacheThreadExecutor: 适合负载较轻的服务器, 适合短期异步的小程序;
实现RejectedExecutionHandler接口,自定义拒绝策略;
任务队列:
ArrayBlockingQueue: 有界队列
LinkedBlockingQueue: 无界队列
SynchronousQueue: 一般最大线程数为最大值,避免执行拒绝策略;
PriorityBlockingQueue:
任务特性:
任务的特性: IO密集型(2*CPU) 计算密集型(CPU+1) 混合型(可以考虑分开)
任务优先级: 高,中,低 (考虑优先级队列)
任务执行时间: 长 中 短 ()
任务依赖性: 是否依赖其它系统资源 ()
java AQS:
aqs常用设计模式:
模板模式
策略模式
独占锁:
ReentrantLock
默认是非公平锁,可重入锁;
CountDownLatch
共享锁
Semaphore
共享锁
自旋锁, 不断循环获取锁,直到获取锁为止
减少上下文切换思路:
无锁并发编程: TDDL生成主键id
CAS: 乐观锁
使用最少线程: 线程池核心线程数,最大线程数,等待队列就是这个原因;
synchronized和lock对比:
参考: