自旋锁原理: 如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。
自旋锁的主要特征
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()
}
}
执行的结果: 屏幕有点小,截的不全。