1. 上下文切换
CPU通过给每个线程分配时间片,时间片非常短,CPU通过不停切换线程实现多线程。
当前任务执行一个时间片后CPU会切换到下一个任务上执行,切换前需要保存当前任务的状态,下次切换回来时要加载之前保存的任务状态。任务从保存到再加载的过程就是一次上下文切换。
线程的创建和上下文切换都有开销。
减少上下文切换:
(1)无锁并发编程。多线程竞争锁时会引起上下文切换,因此可用一些方法避免使用锁。
(2)CAS算法。
(3)使用最少线程,避免创建不需要的线程。
(4)协程。在单线程里实现多任务调度,并在单线程里维持多任务间切换。
2. 死锁
当一个线程拿到锁后,一直无法释放锁(例如死循环等),就会出现死锁。
避免死锁的几个方法:
(1)避免一个线程同时获取多个锁。
(2)避免一个线程在锁内占用多个资源,尽量保证每个锁只占用一个资源。
(3)尝试使用定时锁,用lock.tryLock(timeout)来替代内部锁。
(4)对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
3. 资源限制
资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。
对于硬件资源限制,可以考虑使用集群并行执行程序。
对于软件资源限制,可以考虑使用资源池来复用资源。
网友评论