3. 安全隐患分析
4. 安全隐患解决–互斥锁
@synchronized(锁对象) {// 需要锁定的代码 }
注意:锁定1份代码只用1把锁,用多把锁是无效的。
9.互斥锁的一个Demo
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self demo];
}
-(void)demo {
//模拟2个卖票窗口
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(sellTicket) object:nil];
thread.name = @"买票窗口1";
[thread start];
NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTicket) object:nil];
thread2.name = @"买票窗口2";
[thread2 start];
}
//卖票
-(void)sellTicket{
while (YES) {
//模拟网络卡
[NSThread sleepForTimeInterval:1];
//互斥锁运行步骤详解:
//线程1 票数5 读取5 时间到 保存票数5
//线程2 票数5 读取5 时间到 保存票数5
//线程1 票数5 还原票数5 5-1=4 输出4
//线程2 票数4 还原票数5 5-1=4 输出4
//任意对象
// NSObject *obj = [[NSObject alloc] init];
//加锁的语法,括号内为锁的对象,每个对象内都有一把锁,默认锁是开着的
//同步锁
//[NSUserDefaults standardUserDefaults] synchronize 方便书写synchronized
@synchronized(self.obj){
if(self.tickets >0){
self.tickets = self.tickets - 1;
NSLog(@"%@ 余票 %d",[NSThread currentThread],self.tickets);
continue;
}
}
NSLog(@"没有票啦");
break;
}
}