课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习java编程开发的相关知识点,而今天我们就给大家分享一下,多线程中自旋锁的概念与特点。
多线程中,对共享资源进行访问,为了防止并发引起的相关问题,通常都是引入锁的机制来处理并发问题。
获取到资源的线程A对这个资源加锁,其他线程比如B要访问这个资源先要获得锁,而此时A持有这个资源的锁,只有等待线程A逻辑执行完,释放锁,这个时候B才能获取到资源的锁进而获取到该资源。
这个过程中,A一直持有着资源的锁,那么没有获取到锁的其他线程比如B怎么办?通常就会有两种方式:
1.一种是没有获得锁的进程就直接进入阻塞(BLOCKING),这种就是互斥锁
2.另外一种就是没有获得锁的进程,不进入阻塞,而是一直循环着,看是否能够等到A释放了资源的锁。
自旋锁
二.什么是自旋锁?
当一个线程需要在获取锁的时候,此时正好有其他线程占用着锁,那么此时该线程将会进入循环等待模式,直到成功获取到锁才会退出循环,因此称为自旋锁。
三.什么时候用到自旋锁?自旋锁的适用场景?
1)单核处理器
2)多核处理器
四.自旋锁的优缺点?
自旋锁可以避免上下文切换,但是由于获取到锁的时间不确定,当获取锁需要时间太长的时候,自旋锁的死循环等待模式会造成CPU浪费,导致性能缓慢。
五.自旋锁的特点?
1)被自旋锁保护的临界区代码执行时不能睡眠。单核处理器下,获取到锁的线程睡眠,若恰好此时CPU调度的另一个执行线程也需要获取这个锁,则会造成死锁;多核处理器下,若想获取锁的线程在同一个处理器下,同样会造成死锁,若位于另外的处理器,则会长时间占用CPU等待睡眠的线程释放锁,从而浪费CPU资源。
2)被自旋锁保护的临界区代码执行时不能被其他中断打断。
3)被自旋锁保护的临界区代码在执行时,内核不能被抢占。
六.自旋锁可能潜在的问题
过多占用CPU的资源,如果锁持有者线程A一直长时间的持有锁处理自己的逻辑,那么这个线程B就会一直循环等待过度占用cpu资源
递归使用可能会造成死锁,不过这种场景一般写不出来
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!