自旋锁的原理
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130595548,不管你是大牛还是小白都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)
如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。
分析
- 死循环
- 等待不休眠
- 解锁立即执行
代码
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开发交流群:130595548,不管你是大牛还是小白都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)
网友评论