多线程中自旋锁的概念与特点

   日期:2019-11-13     来源:免费b2b网站    作者:免费b2b网站    浏览:75    
核心提示:随着互联网的不断发展,越来越多的人都在学习java编程开发的相关知识点,而今天我们就给大家分享一下,多线程中自旋锁的概念与特点。多线程中,对共享资源进行访问,为了防止并发引起的相关问题,通常都是引入锁的机制来处理并发问题。

自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自旋锁)。何谓自旋锁?它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

随着互联网的不断发展,越来越多的人都在学习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资源

递归使用可能会造成死锁,不过这种场景一般写不出来

 
打赏
 
更多>同类行业资讯

推荐图文
推荐行业资讯
点击排行
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服