线程同步

举例场景

例子:

  • 重庆售票窗、上海售票窗都在卖一趟飞机票
  • 问题,出现两个售票窗同一时刻卖一张票
  • 这肯定是不合理,下面说解决方式

解决方式

线程锁,我们专业点,嗯线程同步

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 --;
                }


                //代码端执行完了,自动放锁
            }

        }];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值