Loading... ## 上下文切换 1. 多线程一定快吗? <font color='red'><b> 因为有上下文切换代价,并发有可能比串行慢</b></font> 2. 怎么减少上下文切换代价? 如何减少上下文切换?无锁并发编程、CAS算法、使用最少线程和使用协程 - 无锁并发编程。多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。 - CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需要加锁。 - 使用最少线程。避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。 - 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。 ## 死锁 1. 死锁概念? 2. 如何避免死锁? - 避免一个线程同时获取多个锁。 - 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。 - 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。 - 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。 ## 资源限制 1. 概念:资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。例如,服务器的带宽只有2Mb/s,某个资源的下载速度是1Mb/s每秒,系统启动10个线程下载资源,下载速度不会变成10Mb/s,所以在进行并发编程时,要考虑这些资源的限制。硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。 2. 会导致哪些问题? 由于资源受限最后加上上下文切换和资源调度时间最后成了负优化。 3. 如何解决? **硬件资源:集群。** **软件资源:资源复用。** 4. 在资源限制情况下如何并发? 方法就是,根据不同的资源限制调整程序的并发度,比如下载文件程序依赖于两个资源——带宽和硬盘读写速度。有数据库操作时,涉及数据库连接数,如果SQL语句执行非常快,而线程的数量比数据库连接数大很多,则某些线程会被阻塞,等待数据库连接。 最后修改:2023 年 04 月 04 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏