iOS面试 自己实现一个自旋锁
面试的时候被问到了,突然有点懵逼,遂自己研究实现一下
自旋锁的原理
如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。
分析
- 死循环
- 等待不休眠
- 解锁立即执行
代码
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()
}
}
效果
转载自:https://juejin.cn/post/6907109123947495438