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

2,823 阅读1分钟

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

自旋锁的原理

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

分析

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

代码

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()

        }

    }

效果