swift 互斥锁

var tickets = 10000
let lockString = "lockString"

///objc_sync_enter(lockString)
///objc_sync_exit(lockString)
///同步锁,当同步锁上锁后,下一个线程企图访问资源,会被return掉,而不是等待

func buyTicket(username: String) {
    DispatchQueue.global().async {
        ///加上互斥锁,保护资源 同一时刻只能被一个线程读写
        print("\(username)来买票")
        objc_sync_enter(lockString)
        tickets -= 1
        print("\(username)买了一张票,剩余票数:\(tickets)")
        objc_sync_exit(lockString)
    }
}

for i in 0...200 {
    buyTicket(username: "person\(i)")
}

输出:
person0来买票
person2来买票
person0买了一张票,剩余票数:9999
person3来买票
person3买了一张票,剩余票数:9998
person4来买票
person4买了一张票,剩余票数:9997
person5来买票
person5买了一张票,剩余票数:9996
person6来买票
person6买了一张票,剩余票数:9995
person7来买票
person7买了一张票,剩余票数:9994
person8来买票
person8买了一张票,剩余票数:9993
person9来买票
person9买了一张票,剩余票数:9992
person10来买票
person10买了一张票,剩余票数:9991
person11来买票
person11买了一张票,剩余票数:9990
person12来买票
person12买了一张票,剩余票数:9989
person13来买票
person13买了一张票,剩余票数:9988
**重点分析:**多人排队来买票,有人买到了,有人没买到,后边来的人看到窗口正忙,就走了,下下个人到窗口前查看,直到最后一个人。
而不是下一个人等前一个人买完再去买()

dispatchOnce实现

extension DispatchQueue {
    fileprivate static var _onceToken = [String]()
    func once(token: String, _ block: () -> Void) {
        objc_sync_enter(self)
        defer {
             objc_sync_exit(self)
             
        }
        if DispatchQueue._onceToken.contains(token) {
            return
        }
        DispatchQueue._onceToken.append(token)
        block()
    }
}

利用互斥锁,没啥说的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值