swift 多线程锁(一) NSLock

本文介绍了在Swift开发中,多线程环境下使用NSLock解决并发问题。通过售票问题阐述了不加锁导致的问题,接着详细讲解了NSLock的原理、使用方法、注意事项,包括lock会挂起线程、非递归锁特性,以及如何避免死锁。最后提到了递归锁的概念并提供了相关参考资料。
摘要由CSDN通过智能技术生成

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

卖票问题

我们先看已经经典的售票问题,假设我们总共有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次,那结果会更加混乱,感兴趣的读者可以尝试

锁的介绍

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

  • 22
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值