使用多线程遇到的问题
1、上下文切换
CPU通过时间片分配算法来循环执行任务,当前任务执行-一个时间片后会切换到下一个任务。
但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。
所以任务从保存到再加载的过程就是一次上下文切换。
解决方式:
减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。
2、死锁
避免一个线程同时获取多个锁。
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
尝试使用定时锁,使用lock.tryLock(imeout)来替代使用内部锁机制。
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
3、资源限制的挑战
线程不是说越多越好
方法就是,
根据不同的资源限制调整程序的并发度,比如下载文件程序依赖于两个资源带宽和硬盘读写速度。
有数据库操作时,涉及数据库连接数,如果SQL语句执行非常快,而线程的数量比数据库连接数大很多,则某些线程会被阻塞,等待数据库连接。
https://baijiahao.baidu.com/s?id=1674003930734516720&wfr=spider&for=pc