内存模型
重排序
顺序一致性
happens-before
要想保证执行操作B的线程看到线程A的结果,
那么A和B之间必须满足Happen-Before规则。
子主题 2
as-if-serial
并发基础
AQS
AbstractQueueSynchronizer同步器
CLH同步队列
同步状态的获取和释放
线程阻塞和唤醒
线程池
Executor
ThreadpoolExecutor
Callable
Future
ScheduleExecutorService
关闭线程池
shutdownNow方法,可能会引起报错,要对任务里进行异常捕获.
shutdown方法可能会导致线程关闭不了,不应有永久阻塞等待的逻辑。
shutdownNow和shuwdown调用完,线程池并不是立马就关闭了,
要想等待线程池关闭,还需调用awaitTermination方法来阻塞等待
RejectedException
AbortPolicy:直接抛出RejectedExecutionException异常,阻止系统正常运行
CallerRunsPolicy:该策略既不会抛弃任务,也不会抛出异常,而是将不能执行的任务回退给调用者,从而降低新任务的流量
DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务
DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案
原理
1. 当线程池中的线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
2. 当线程池达到corePoolSize时,新提交任务将被放入 workQueue 中,等待线程池中任务调度执行。<br>
3. 当workQueue已满,且 maximumPoolSize 大于 corePoolSize 时,新提交任务会创建新线程执行任务<br>
4. 当提交任务数超过maxmumPoolSize+workQueue时,新提交任务由 RejectedExecutionHandler 处理
5. 当线程池中线程数超过corePoolSize,空闲时间超过keepAliveTime的线程会被销毁
6. 当设置allowCoreThreadTimeOut(true)时,任何线程空闲时间超过keepAliveTime后就会被销毁。
优化
使用本地变量
使用不可变类<br>
最小化锁的范围<br>
使用线程池<br>
使用同步代替线程的wait和notify<br>
使用BlockingQueue使用消费者生产者模式<br>
使用并发集合而不是锁的同步集合
使用同步代码块而不是同步方法
避免使用静态变量,多常量
优化
使用本地变量
使用不可变类<br>
最小化锁的范围<br>
使用线程池<br>
使用同步代替线程的wait和notify<br>
使用BlockingQueue使用消费者生产者模式<br>
使用并发集合而不是锁的同步集合
使用同步代码块而不是同步方法
避免使用静态变量,多常量