互斥锁小结
互斥锁,就是使用了线程同步技术.
同步锁/互斥锁:可以保证被锁定的代码,同一时间,只能有一个线程可以操作.
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;
}
}
}
}