多线程面临的挑战:上下文切换的问题、死锁、受限于硬件和软件的资源限制问题;
上下文切换
单个CPU通过分配时间片实现多线程并发,一个CPU时间片大概几十毫秒;
一次上下文切换:CPU分配时间片切换任务时需要保存上一个任务的状态,线程任务的保存和重新加载的过程即是一次上下文切换;
多线程不一定快:因为有上下文切换、线程创建、资源调度的开销;
测试上下文切换次数和时长:Lmbench3、Linux自带的vmstat命令;
减少上下文切换:无锁并发(减少锁的竞争);CAS算法;使用最少的线程;使用协程(单线程自己实现多任务调度和切换);
死锁
避免死锁的方法:
1. 避免一个线程获取多把锁;
2. 避免一个线程在一把锁内获取多个资源,每把锁只占用一个资源;3
3. 使用定时锁代替内部锁机制:lock.tryLock(timeout);
资源限制
硬件资源限制:如带宽(影响上传下载)、IO速度、CPU速度等;解决:集群;
软件资源限制:数据库连接数、Socket连接数、文件句柄;解决:连接池复用连接、单连接、限制连接数;
如何解决:根据不同资源限制调整并发参数;