//@synchronized(){//锁的内容};
//互斥锁(同步锁)
//如果一个数据的操作使用互斥锁锁住,那么若果一个线程正在
//对这个数据操作的时候,其他线程需要对这个数据进行操作的线程会处于阻塞状态
//当正在进行操作的线程完成之后,其他线程才恢复就绪和运行状态;
//对这个数据进行操作;
//锁定一段代码只需一把锁,用多把锁是无效的;
//缺点:消耗大量的CPU
//自旋锁(atomic)
////如果一个数据的操作使用互斥锁锁住,那么若果一个线程正在
//对这个数据操作的时候,其他线程需要对这个数据进行操作的线程会处于无限循环状态
//当正在进行操作的线程完成之后,其他线程直接去访问数据;
//线程之间的通信:
//
#import "ViewController.h"
@interface ViewController (){
//票的数量
int _ticketCount;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//票默认有1000张
_ticketCount = 1000;
}
#pragma mark - 触摸事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//创建一个线程去买票
NSThread *thread = [[NSThread alloc]initWithTarget:
self selector:@selector(saleTicket) object:nil];
thread.name = @"A";
[thread start];
NSThread *thread2 = [[NSThread alloc]initWithTarget:self
selector:@selector(saleTicket) object:nil];
thread2.name = @"B";
[thread2 start];
}
#pragma mark - 卖票
- (void)saleTicket{
while (_ticketCount > 0) {
@synchronized(self){
//{}里面是需要锁的内容
//一定要包含线程对数据操作的起始点和终点
//开始操作到操作结束
[NSThread sleepForTimeInterval:2];
_ticketCount -= 1;
NSLog(@"%@:%d",[NSThread currentThread],_ticketCount);
}
}
NSLog(@"卖光了");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end