美文网首页iOS开发_核心
swift中的"互斥锁"

swift中的"互斥锁"

作者: __zimu | 来源:发表于2015-12-22 13:41 被阅读2100次

    前言

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

    相关文章

      网友评论

        本文标题:swift中的"互斥锁"

        本文链接:https://www.haomeiwen.com/subject/fiamhttx.html