swift中的"互斥锁"

前言

脱产学习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, 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了. 有兴趣的可以自己试试.

你可能感兴趣的:(swift中的"互斥锁")