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