当前位置:   article > 正文

swift 多线程锁(一) NSLock_swift 锁

swift 锁

多线程的相关的开发中,必定会有锁的应用,这是因为如果多个线程极有可能会同时读取或者修改一个对象的值,那这时候很可能会出问题,比如读取的数值不对,或者出现之前对象的值已经被释放而引发野指针的问题

卖票问题

我们先看已经经典的售票问题,假设我们总共有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)")
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

打印结果如下:

出票一张: 剩余: 8
出票一张: 剩余: 8
出票一张: 剩余: 8
出票一张: 剩余: 8
出票一张: 剩余: 7
出票一张: 剩余: 6
出票一张: 剩余: 5
出票一张: 剩余: 4
出票一张: 剩余: 3
出票一张: 剩余: 2
出票一张: 剩余: 1
出票一张: 剩余: 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注意看,这里的剩余票数不对,且只有10张票,出票了12次。

另外需要说明的是,因为是多线程的问题,所以随着并发次数增多,那错误会更多,比如10000张票,分10个渠道,分别尝试出票1000次,那结果会更加混乱,感兴趣的读者可以尝试

锁的介绍

这里介绍下锁的概念,所谓的锁,就是当你操作这个变量的时候,把权限门锁上,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/691595
推荐阅读
相关标签
  

闽ICP备14008679号