Java并发编程的艺术学习——上下文切换、死锁

2019年10月17日 学习完Java并发编程的艺术的第一章之后,有下面的总结:

一、对已经熟悉的内容的总结:

1、上下文切换概念:被挂起的线程保存现场,在获得CPU之后被加载,并恢复现场重新执行的过程。

2、并行一定比串行执行快吗?不一定,在执行次数比较小的时候,因为上下文切换需要开销,导致并行执行的速度甚至更慢。

3、如何减少上下文切换?无锁并发编程、CAS算法、使用最少数量的线程和使用协程。

     无锁并发编程:多线程竞争相同的资源时,会引起上下文切换。那么我们可以让不同的线程对不同的数据资源,或者同一数据的不同段进行操作;

     CAS算法:Java 的 Atomic 包使用 CAS 算法来更新数据,而不需要加锁。(这种方式思想同无锁并发编程一样,只不过这是一种具体的且常见的实现手段);

     使用最小数量的线程:避免创建不必要的线程,不仅减少了上下文切换的量,还通过减少线程创建过程,减少了系统开销;

     使用协程:引入任务的概念,在同一个线程中设置多个任务的调度执行,并且在单线程内部维持多个任务的切换。

4、死锁定义:系统中多个线程在执行过程中,因为竞争资源(相互等待对方已经占有了的资源)或者通信而造成的一种阻塞现象,如果没有外力作用,这种状态将一直持续下去的现象。四个必要条件:互斥、占有且等待、非剥夺、循环等待。解决方法:死锁预防(尽量破除四个必要条件)、死锁避免(银行家算法)、死锁检测和解除。

二、扩展学习:

1、上下文切换的种类:自发性上下文切换、非自发性上下文切换。

     自发性上下文切换:线程由于自身的因素被切换出去,暂停执行。例如:调用sleep() wait() yeild()等方法;

     非自发性上下文切换:线程被迫失去CPU,而暂停执行。例如时间片用完,或者被优先级更高的线程抢占了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值