多线程之互斥锁

互斥锁小结

互斥锁,就是使用了线程同步技术.
同步锁/互斥锁:可以保证被锁定的代码,同一时间,只能有一个线程可以操作.
self :锁对象,任何继承自NSObject的对像都可以是锁对象,因为内部都有一把锁,而且默认是开着的.
锁对象 : 一定要是全局的锁对象,要保证所有的线程都能够访问,self是最方便使用的锁对象.
互斥锁锁定的范围应该尽量小,但是一定要锁住资源的读写部分.
加锁后程序执行的效率比不加锁的时候要低.因为线程要等待解锁.
牺牲了性能保证了安全性.

demo

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 在主线程中卖票
//     [self saleTickets];

    // 售票口 A
    NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTickets) object:nil];
    thread1.name = @"售票口 A";
    [thread1 start];

    // 售票口 B
    NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTickets) object:nil];
    thread2.name = @"售票口 B";
    [thread2 start];
}

- (void)saleTickets {

    while (YES) {
        [NSThread sleepForTimeInterval:1.0];
        //添加互斥锁
        @synchronized (self) {
            //判断是否有票
            if (self.tickets > 0) {
                //有票就卖
                self.tickets--;
                //卖完一张票就提示用户余票数
                NSLog(@"剩余票数 -> %d  %@", self.tickets, [NSThread currentThread]);
            } else {
                // 没有就提示用户
                NSLog(@"没票了");
                break;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值