
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
锁的应用在java编程开发项目中是非常常见的一个功能应用,而今天我们就通过案例分析来了解一下,自旋锁的概念以及解决方法。
当多个线程想同时访问同一个资源时,就存在资源冲突,这时,大家直接想到的就是加锁来互斥访问,加锁会有这么几个问题:
等待资源的线程进入睡眠,发生用户态向内核态的切换,有一定的性能开销;
占用资源的线程很快就用完并释放,这时等待的线程被唤醒,又要立即切换回用户态;
那么,如果有一种方式,使得等待的线程先短暂的等待一会儿,有可能有两种结果:
等待的时间超过了这一会儿,那没办法,只好进入睡眠;
等待的时间还未超过,占用资源的线程释放了,这时等待的线程就可以直接占用资源。
这就是锁的小优化:自旋锁!自旋锁并不是真正的锁,而是让等待的线程先原地"小转"一下
发生自旋锁死锁,往往因为单CPU这个临界资源发生了抢占,使得一方持有自旋锁被中断暂停,一方不断自旋来尝试获取自旋锁。因此,在多CPU架构下,两方如果分别运行在不同CPU上,是不会发生死锁的。
因此,自旋锁有几个重要特性需要掌握(精髓):
持有自旋锁的线程(此时肯定在临界区)不能休眠,休眠会引起进程切换,CPU就会被另一个进程占用等无法使用;
持有自旋锁的线程不允许被中断,哪怕是ISR也不行,否则就存在ISR自旋;
持有自旋锁的线程,其内核不能被抢占,否则等同于CPU被抢占;
所以,根据以上总结一点:持有自旋锁的线程,不能因为任何原因而放弃CPU!也因此基于上述问题,自旋也需要添加一个上限时间以防死锁。
linux上的自旋锁有三种实现:
在单cpu,不可抢占内核中,自旋锁为空操作。
在单cpu,可抢占内核中,自旋锁实现为“禁止内核抢占”,并不实现“自旋”。(注意)
在多cpu,可抢占内核中,自旋锁实现为“禁止内核抢占”+“自旋”。
希望这辈子,最让你无悔的事情就是来达内学习!学习向来不是件易事,但无论过程多么艰难,希望你依然热爱生活,热爱学习!永远记得,达内将与你一同前行!现在扫码,立即领取万元课程礼包,助力0基础快速入行,为你梳理行业必备技能,全方位了解岗位发展前景!
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。