0
点赞
收藏
分享

微信扫一扫

iOS面试 自己实现一个自旋锁

以沫的窝 2021-09-19 阅读 85

面试的时候被问到了,突然有点懵逼,遂自己研究实现一下

自旋锁的原理

如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。

分析

  • 死循环
  • 等待不休眠
  • 解锁立即执行

代码

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开发交流群
    以下资料在群文件可自行下载

    驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!**


作者:Mikebanana
链接:https://juejin.cn/post/6907109123947495438

举报

相关推荐

0 条评论