前言
脱产学习swift中, 从多线程开始, 遇到了类似于oc中的多线程资源抢夺问题..
oc中的解决方案是利用 "互斥锁" @synchronized(self)
来解决, 然而 swift并不支持这种写法, 于是查了下资料. 解决办法如下:
NSLock
想必多线程资源抢夺问题最经典的案例就是买票的demo了..
把我的demo挂上来,仅供大家参考
swift中是使用了NSLock锁对象来完成的.
class ViewController: UIViewController {
var ticket = 20
//NSLock锁对象
var lock = NSLock()
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let thread1 = NSThread(target: self, selector: "saleTickets", object: nil)
thread1.name = "售票点A"
thread1.start()
let thread2 = NSThread(target: self, selector: "saleTickets", object: nil)
thread2.start()
thread2.name = "售票点B"
}
@objc private func saleTickets() {
//swift目前没有类似于 oc 的互斥锁机制 @synchronized(self)
//解决方案如下
while true {
//满足条件, 加锁
lock.lock()
//模拟延时
NSThread.sleepForTimeInterval(0.5)
if ticket > 0
{
ticket--
print(NSThread.currentThread(), "当前票数\(ticket)")
}
else
{
print("没有票了")
//一轮售票完毕,解锁
lock.unlock()
break;
}
//一次循环完毕,解锁
lock.unlock()
}
}
}
最后再说两句
当然,我本人定义了一个全局的锁对象来加锁解锁, 可能会有人认为比较麻烦, 可以试一下在salesTicket里设置一个局部锁对象, 这样当方法循环完毕以后锁会自动释放掉,就不需要自己手动去unlock了. 有兴趣的可以自己试试.