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