赞
踩
在多线程的相关的开发中,必定会有锁的应用,这是因为如果多个线程极有可能会同时读取或者修改一个对象的值,那这时候很可能会出问题,比如读取的数值不对,或者出现之前对象的值已经被释放而引发野指针的问题
我们先看已经经典的售票问题,假设我们总共有500张票,有4个网络渠道同步售卖
先看不加锁的情况,并发4个线程来同时卖票,代码如下:
class ViewController: UIViewController { var num = 10 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. DispatchQueue.global().async { for _ in 0...10 { self.buy() } } DispatchQueue(label: "1",attributes: .concurrent).async { for _ in 0...10 { self.buy() } } DispatchQueue(label: "2",attributes: .concurrent).async { for _ in 0...10 { self.buy() } } for _ in 0...100 { self.buy() } print("main thread完成任务") } func buy(){ if num > 0{ num -= 1 print("出票一张: 剩余: \(num)") } } }
打印结果如下:
出票一张: 剩余: 8
出票一张: 剩余: 8
出票一张: 剩余: 8
出票一张: 剩余: 8
出票一张: 剩余: 7
出票一张: 剩余: 6
出票一张: 剩余: 5
出票一张: 剩余: 4
出票一张: 剩余: 3
出票一张: 剩余: 2
出票一张: 剩余: 1
出票一张: 剩余: 0
注意看,这里的剩余票数不对,且只有10张票,出票了12次。
另外需要说明的是,因为是多线程的问题,所以随着并发次数增多,那错误会更多,比如10000张票,分10个渠道,分别尝试出票1000次,那结果会更加混乱,感兴趣的读者可以尝试
这里介绍下锁的概念,所谓的锁,就是当你操作这个变量的时候,把权限门锁上,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。