上下文切换
什么是上下文切换
CPU通过给每个线程(任务)分配时间片实现多线程执行代码(多任务处理),当每个时间片结束、CPU切换到下一个任务前,需要保存当前任务的状态,切换到下一个任务时需要加载该任务的状态。
上下文切换带来的问题
进程/线程上下文切换会用掉你多少CPU?zhuanlan.zhihu.com/p/79772089
如何减少上下文切换
- 无锁并发编程:如将数据进行hash取模后分段并发处理。
- CAS算法:java的Atomic包使用CAS算法来更新数据,而不需要加锁。
- 使用最少线程:避免创建不需要的线程。
- 协程:在单线程中实现多任务调度,如quasar fiber、jdk19中的虚拟线程等。
死锁
什么是死锁
示例:
如何避免死锁
- 避免一个线程获取多个锁。
- 避免一个线程在锁区间内同时占用多个资源。
- 使用定时锁,如
java.util.concurrent.locks.Lock#tryLock(long, java.util.concurrent.TimeUnit)。 - 对于数据库锁,加锁和解锁必须在同一个数据库连接中。
资源限制
什么是资源限制
并发编程场景下,程序的执行速度受限于硬件或软件资源,如带宽限制、磁盘读写速度、CPU处理速度、数据库连接数、socket连接数等。
资源限制引发的问题
受限于资源,串行的代码改为并行执行并不能加快速度,反而因为增加了上下文切换、资源调度时间,变得更慢。
如何解决资源限制引发的问题
- 硬件资源限制:如通过多机器执行程序,绕开单机资源限制。
- 软件资源限制:如使用连接池复用数据库连接。
资源限制下如何进行并发编程
根据资源限制调整程序的并发度。