iOS自定义自旋锁

310 阅读1分钟

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

自旋锁的主要特征

1.不停的去获取锁的状态 2.等待不休眠 2.锁释放立即获取到锁,去执行

具体代码实现: /** 创建自旋锁的结构体 flag 标记锁的状态 */ struct XZCSpinLock { 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
    }
}

} /** 创建自旋锁的类 */ class SpinLockViewController: UIViewController {

//初始化一个自旋锁
var spinLock = XZCSpinLock.init(flag: 0)

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = .red
    testSpinLock()
    // Do any additional setup after loading the view.
}

/** 两条异步线程去执行 */

func testSpinLock() {
    DispatchQueue.global().async {
        self.action()
    }
    DispatchQueue.global().async {
        self.action()
    }
}

//加锁执行
func action(){
    var num = 0
    while spinLock.flag == 0 {
        
        spinLock.lock()
        
        if num >= 100{
            spinLock.unlock()
            
            return
        }
        num += 1
        
        print("\(num)----\(Thread.current)")
        
        spinLock.unlock()
        
    }
}

执行的结果: 屏幕有点小,截的不全。

截屏2021-03-18 下午5.07.03.png