项目 Demo 下载
信号量的初始值,可以用来控制线程并发访问的最大数量
信号量的初始值为 1. 代表只允许 1 条线程访问资源,保证线程同步
常用的使用场景:
1.处理线程安全.保证线程同步
2.多个网络请求同步请求.

模拟火车卖票.线程不安全
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
//全局队列,并发
let queue = DispatchQueue.global()
var index: Int = 0
for _ in 0...10 {
queue.async {
self.soldTicket()
}
index += 1
}
}
//卖票
func soldTicket() {
sleep(1)
total -= 1;
print("卖掉一张票,剩余\(total)张")
}

模拟火车卖票.线程安全
//票的总数
var total: Int = 20
var lock: NSLock = NSLock()
let sem = DispatchSemaphore(value: 1)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
//全局队列,并发
let queue = DispatchQueue.global()
var index: Int = 0
for _ in 0...10 {
queue.async {
//如果信号量>0 .那么信号量-1 .执行下句代码
self.sem.wait()
self.soldTicket()
//信号量+1
self.sem.signal()
}
index += 1
}
}
//卖票
func soldTicket() {
sleep(1)
total -= 1;
print("卖掉一张票,剩余\(total)张")
}

模拟多个网络请求同步请求
func syncDemo() {
var index: Int = 0
let queue = DispatchQueue.global()
for _ in 0...10 {
self.sem.wait()
queue.async {
let queue = DispatchQueue(label: "")
queue.asyncAfter(deadline: DispatchTime.now() + 2, execute: {
print("index = \(index)");
self.sem.signal()
})
}
index += 1
}
}

网友评论