0.学习资料
《Java并发编程的艺术》第一章
1.上下文切换
单核处理器支持多线程时,通过cpu时间片切换(分配)来实现
- 时间片执行完可能会切换到其他任务
- 切换前保存当前任务状态,然后加载其他任务,之后某个时间片切换回该任务可继续加载该任务,这个任务切换过程就是一次上下文切换
任务从保存到加载的过程,任务间切换的时间
导致在数据量少时并发反而不如串行(创建与切换的消耗)
1.1 查看上下文切换
Lmbench3工具可查看上下文切换时长
vmstat命令可查看上下文切换次数
1.2 减少上下文切换
无锁并发编程
给线程分段使它们处理的任务不冲突,如ConcurrentHashMap
CAS算法
Java的Atomic包,原子操作
Compare and swap,比较并交换,不需要加锁
使用最少线程
避免创建不必要的线程
协程调度
通过协程实现任务调度
2.死锁
线程相互等待释放锁则造成死锁
避免死锁四个方法
- 避免一个线程获取多个锁
- 避免一个锁内占用多个资源,尽量保证每个锁只占用一个资源
- 可以使用定时锁来代替内部锁
- 数据库锁的加锁和解锁必须在一个数据库连接里,否则会解锁失败
3.资源限制
硬件:带宽,硬盘,cpu等
软件:数据库连接,socket连接等
引发问题
资源不足导致并发性能不如串行,无法并发执行
解决资源限制
硬件:搭建集群或提高单机性能
软件:使用池复用资源,数据库/socket连接池
4.JUC
Java.util.concurrent,JDK并发包,能够解决很多并发问题。