并发要面对的事儿
上下文切换
时间片一般是几十毫秒
线程有创建和上下文切换的开销
测试上下文切换次数和时长
- Lmbench3:时长
- vmstat:次数
- Linux自带命令
CS(Content Switch):上下文切换次数
- 如何减少上下文切换
- 无锁并发编程
- 数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据
- CAS算法
- Java的Atomic包使用CAS算法来更新数据,且无需加锁
- 使用最少线程
- 避免创建不需要的线程
- 协程
- 在单线程里实现多任务的调度
- 在单线程里维持多个任务间的切换
- 无锁并发编程
死锁
- 避免死锁的方法
- 避免一个线程同时获取多个锁
- 避免一个线程在锁内同时占用多个资源
- 尽量保证每个锁只占用一个资源
- 尝试使用定时锁,使用
lock.tryLock(timeout)
来代替使用内部锁机制 - 对于数据库锁,加锁和解锁必须在同一个数据库连接里
- 否则会出现解锁失败的情况
资源限制
资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源
- 硬件资源
- 带宽的上传/下载速度
- 硬盘读写速度
- CPU的处理速度
- 软件资源
- 数据库的连接数
- socket连接数
- 等等
在并发编程中,如果将某段串行的代码并发执行,因为受限于资源,仍然在串行执行,这时候程序不会加快,反而会更慢,因为增加了上下文切换和资源调度的时间。
- 解决办法
- 硬件资源限制
- 使用集群并行执行
- 软件资源限制
- 采用资源池将资源复用
- 硬件资源限制
根据不同的资源限制调整程序的并发度