举例场景
例子:
- 重庆售票窗、上海售票窗都在卖一趟飞机票
- 问题,出现两个售票窗同一时刻卖一张票
- 这肯定是不合理,下面说解决方式
解决方式
线程锁,我们专业点,嗯线程同步
GCD Semaphore (信号量)
示例代码
//"最后一张票,不骗你"
__block NSInteger planeTicketCount = 1;
// 创建线程锁 信号=1
dispatch_semaphore_t semaphore = hSemaphore(1);
while (1) {
if (planeTicketCount == 0) break;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 信号递减 == 0 就上锁 线程一直在这里等待 ,后面一个参数是等待时间
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
if (planeTicketCount > 0) {
// 卖掉了
planeTicketCount --;
}
// 信号递增 不等0 则唤醒还在等待此信号的线程
dispatch_semaphore_signal(semaphore);
});
}
NSLock (锁)
//"最后一张票,不骗你"
__block NSInteger planeTicketCount = 1;
// 买了一把锁
NSLock *Lock = [[NSLock alloc]init];
while (1) {
if (planeTicketCount == 0)break;
[[hGCD globalQueue]queueBlock:^{
// 锁上,不让其他线程过去了
[Lock lock];
if (planeTicketCount >0 ) {
planeTicketCount --;
}
// 解锁,其他线程可以进入此代码段了
[Lock unlock];
}];
}
@synchronized (self) 顾名思义同步
//"最后一张票,不骗你"
__block NSInteger planeTicketCount = 1;
while (1) {
if (planeTicketCount == 0)break;
[[hGCD globalQueue]queueBlock:^{
// 括起来的这一段代码 同一时间只能有一个线程执行
@synchronized (self) {
if (planeTicketCount >0 ) {
planeTicketCount --;
}
//代码端执行完了,自动放锁
}
}];
}