并发编程的目的是为了让程序运行的更快,但是并不是启动更多的线程就能让程序最大限度地并发执行。会面临非常多的挑战
1.上下文切换
CPU通过给每个线程分配CPU时间片来实现多线程机制。当任务 执行一个时间片后会切换到下一个任务。但是在切换前会保存上一个任务的状态,以便下次切换回来这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换
2.死锁
两个线程互相等待对方释放锁,会引起死锁。
如何避免
避免一个线程同时获取多个锁
避免一个线程同时占用多个资源,尽量保证每个锁只占用一个资源
尝试使用定时锁,使用lock.tryLock(timeout)来替代
对于数据库锁,加锁和解锁必须在一个数据库链接里,否者会出现解锁失败的情况。
3.资源限制的挑战
资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或者软件资源。
例如,服务器的带宽只有2Mb/s,某个资源的下载速度是1Mb/s,启动10个线程,下载速度也不会变成10Mb/s.