java基础——自旋锁

参考:https://blog.csdn.net/sunp823/article/details/49886051

https://www.cnblogs.com/wade-luffy/p/5969418.html

一、自旋锁的概念

  普通的锁,是线程A拥有了锁之后,线程B如果此时想要获得A的锁,则需要等待进入阻塞态,等待线程A 释放锁之后,然后从阻塞态进入唤醒态去获得A释放的锁;然后线程的阻塞和唤醒在操作系统层面需要从用户态切换到核心态,这样是非常消耗资源的工作,需要选择一种优化来优化这种弊端;并且我们会发现,很多的对象锁的锁定时间并不是非常长,如整数的自加的操作,这些操作的代价即很短的时间内进行阻塞和唤醒线程的操作显然是很浪费的;所以在这种去下,如果系统阻塞上下文的代价大于线程等待的代价的时候,可以让线程B不用进入阻塞状态,而是进入一段短暂的自旋转状态,不出让其CPU时间片,而是保持运行状态,在本地进行忙等状态;

  所谓自旋:就是线程B进入一段循环状态,循环结束后再去重新竞争锁,如果竞争得不到则继续循环,循环过程中线程会一直处于running状态;

二、 优缺点:

  自旋锁节省了系统从阻塞态到运行态的系统开销;但是依然存在一些弊端

如果锁持有者长时间不释放锁,哪线程B自旋的代价会很大,长时间占用CPU时间片,导致CPU资源的浪费;所以需要规定一定时间的自旋时间,当超过这个时间,则线程B自动进入阻塞态;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值