iOS 底层面试

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

2021-01-05  本文已影响0人  一意孤行的程序猿

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

自旋锁的原理

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

分析

代码

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开发,全栈发展,欢迎入驻,共同进步!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)


作者:Mikebanana
链接:https://juejin.cn/post/6907109123947495438
上一篇 下一篇

猜你喜欢

热点阅读