申明:此为本人学习笔记,若有纰漏错误之处的可留言共同探讨
/*
情景:哆啦A梦、大雄、胖虎三人各自在自己的手机上买火车票想去富士山旅游,哆啦A梦想和它妹妹一起去,想买2张票;大雄想和静香去,也想买两张票;胖虎想和爸爸妈妈去,想买三张票。
火车站现在只剩下3张火车票。请通过多线程技术实现他们各自抢票的结果。
*/
情景分析:
1 三个人买票,他们是在各自的手机上买的,因此要开辟三个线程。
2 分线程的执行是同时进行的,因此为了防止后台的票空了还被购买,每次只能有一个人买完票才开放给另一个人买,如果没票了不允许被购买。
设计思路
1 为每个分线程开辟一个同步锁。
2 每个线程执行完才解锁给下个线程进入
另: 同步锁可以用@synchronized(self)
{
要执行的线程;
}
进行替换,效果是一样的。功能都是确保该线程执行时没有其他线程对self对象进行修改
*/
具体代码如下:
#import "ViewController.h"
@interface ViewController ()
{
NSInteger ticket; // 火车票
NSLock *myLock;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
ticket = 3; // 三张票
// 加个同步锁
myLock = [[NSLock alloc]init];
[NSThread detachNewThreadSelector:@selector(amengBuy) toTarget:self withObject:nil];
[NSThread detachNewThreadSelector:@selector(daxiongBuy) toTarget:self withObject:nil];
[NSThread detachNewThreadSelector:@selector(panghuBuy) toTarget:self withObject:nil];
}
#pragma mark - 买票线程
-(void)amengBuy
{
[myLock lock];
if (ticket>2) {
NSLog(@"哆啦A梦买到2张票");
ticket -=2;
NSLog(@"哆啦A梦买完剩下%ld张票",ticket);
}else
{
NSLog(@"没有足够的票可以给哆啦A梦买");
}
[myLock unlock];
}
-(void)daxiongBuy
{
[myLock lock];
if (ticket>2) {
NSLog(@"大雄买到2张票");
ticket -=2;
NSLog(@"大雄买完剩下%ld张票",ticket);
}else
{
NSLog(@"没有足够的票可以大雄买");
}
[myLock unlock];
}
-(void)panghuBuy
{
[myLock lock];
if (ticket>3) {
NSLog(@"胖虎买到3张票");
ticket -=3;
NSLog(@"胖虎买完剩下%ld张票",ticket);
}else
{
NSLog(@"没有足够的票可以胖虎买");
}
[myLock unlock];
}
@end