iOS面试 自己实现一个自旋锁

面试的时候被问到了,突然有点懵逼,遂自己研究实现一下

自旋锁的原理

如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。

分析

  • 死循环
  • 等待不休眠
  • 解锁立即执行

代码

struct LYSpinLock{
    var flag = 0

    mutating func lock(){
        while (self.setFlag() != 0) {
        }
    }
    mutating func unlock(){
        flag = 0
    }
    private mutating func setFlag()->Int{
        if flag == 0{
            flag = 1
            return 0
        }else{
            return 1
        }
    }
}

应用

//全局变量
    var spinlock = LYSpinLock.init(flag: 0)

//两个线程调用
          DispatchQueue.global().async {
            self.action()
        }
        DispatchQueue.global().async {
            self.action()
        }

//具体加锁代码
     func action(){

        while true {

            spinlock.lock()

            if num >= 100{
                spinlock.unlock()

                return
            }
            num += 1

            print("\(num)----\(Thread.current)")

            spinlock.unlock()

        }

    }

效果

最后推荐个我的iOS交流群:789143298
'有一个共同的圈子很重要,结识人脉!里面都是iOS开发,全栈发展,欢迎入驻,共同进步!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

  • ——点击加入:iOS开发交流群
    以下资料在群文件可自行下载

    驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!**


作者:Mikebanana
链接:https://juejin.cn/post/6907109123947495438

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值