面试的时候被问到了,突然有点懵逼,遂自己研究实现一下
自旋锁的原理
如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。
分析
- 死循环
- 等待不休眠
- 解锁立即执行
代码
struct LYSpinLock{
var flag = 0
mutating func lock(){
while (self.setFlag() != 0) {
}
}
mutating func unlock(){
flag = 0
}
private mutating func setFlag()->Int{
if flag == 0{
flag = 1
return 0
}else{
return 1
}
}
}
应用
//全局变量
var spinlock = LYSpinLock.init(flag: 0)
//两个线程调用
DispatchQueue.global().async {
self.action()
}
DispatchQueue.global().async {
self.action()
}
//具体加锁代码
func action(){
while true {
spinlock.lock()
if num >= 100{
spinlock.unlock()
return
}
num += 1
print("\(num)----\(Thread.current)")
spinlock.unlock()
}
}
效果
最后推荐个我的iOS交流群:789143298
'有一个共同的圈子很重要,结识人脉!里面都是iOS开发,全栈发展,欢迎入驻,共同进步!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)
-
——点击加入:iOS开发交流群
以下资料在群文件可自行下载
驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!**
作者:Mikebanana
链接:https://juejin.cn/post/6907109123947495438
网友评论