文章要点
1.上线文切换
2.死锁
1.1 上线文切换
1.1.1 概念
CPU是通过给线程分配时间片的手段来实现多线程的,只不过这个时间分片相对较快,切换也较快,所以给我们的错觉是多线程并行执行。
然而,现成的上下文切换,需要记录线程的状态,以便下次切回这个线程任务时,继续执行。这样来回切换其实比较影响效率。
所以说单核CPU且任务比较小的话,多线程不一定就快。
1.1.2 如何减少上下文切换
无锁化编程、CAS算法、减少使用线程和使用协程
- 无锁化并发编程:多线程竞争锁,会引起上线文切换,所以多线程处理大数据时,可以hash算法将数据分给不同的线程,可以切分避免锁竞争
- CAS算法:java中现成的Atomic包,可以用来CAS
- 线程适量即可,不是越多越好
- 协程:folk-join模式
1.2 死锁
1.2.1概念
死锁:简单来说两个或多个线程相互等待对方释放自己所需要的锁,导致这些线程处于等待状态,无法前往执行。
产生的条件如下:
- 互斥条件:进程对于所分配到的资源具有排它性,即一个资源只能被一个进程占用,直到被该进程释放
- 请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放。
- 不剥夺条件:任何一个资源在没被该进程释放之前,任何其他进程都无法对他剥夺占用
- 循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞
1.2.2 避免死锁
避免死锁:
- 避免一个线程同事获取多个锁
- 避免一个线程在锁内同时占用多个资源,尽量保证一个锁只占用一个资源
- 尝试使用超时所









网友评论