2019年10月17日 学习完Java并发编程的艺术的第一章之后,有下面的总结:
一、对已经熟悉的内容的总结:
1、上下文切换概念:被挂起的线程保存现场,在获得CPU之后被加载,并恢复现场重新执行的过程。
2、并行一定比串行执行快吗?不一定,在执行次数比较小的时候,因为上下文切换需要开销,导致并行执行的速度甚至更慢。
3、如何减少上下文切换?无锁并发编程、CAS算法、使用最少数量的线程和使用协程。
无锁并发编程:多线程竞争相同的资源时,会引起上下文切换。那么我们可以让不同的线程对不同的数据资源,或者同一数据的不同段进行操作;
CAS算法:Java 的 Atomic 包使用 CAS 算法来更新数据,而不需要加锁。(这种方式思想同无锁并发编程一样,只不过这是一种具体的且常见的实现手段);
使用最小数量的线程:避免创建不必要的线程,不仅减少了上下文切换的量,还通过减少线程创建过程,减少了系统开销;
使用协程:引入任务的概念,在同一个线程中设置多个任务的调度执行,并且在单线程内部维持多个任务的切换。
4、死锁定义:系统中多个线程在执行过程中,因为竞争资源(相互等待对方已经占有了的资源)或者通信而造成的一种阻塞现象,如果没有外力作用,这种状态将一直持续下去的现象。四个必要条件:互斥、占有且等待、非剥夺、循环等待。解决方法:死锁预防(尽量破除四个必要条件)、死锁避免(银行家算法)、死锁检测和解除。
二、扩展学习:
1、上下文切换的种类:自发性上下文切换、非自发性上下文切换。
自发性上下文切换:线程由于自身的因素被切换出去,暂停执行。例如:调用sleep() wait() yeild()等方法;
非自发性上下文切换:线程被迫失去CPU,而暂停执行。例如时间片用完,或者被优先级更高的线程抢占了。