#import "ViewController.h"
@interface ViewController ()
//NSLock
//既可以对基本数据类型的数据加锁,也可以对对象加锁,是万能的
@property(nonatomic,strong) NSLock *lock;
@end
@implementation ViewController
//服务器的余票数
static NSInteger count = 5000;
//买票方法
-(void)buyTicket
{
[self.lock lock];
count --;
NSLog(@"%ld",count);
[_lock unlock];
}
//给lock懒加载,分配内存
-(NSLock *)lock
{
if (_lock == nil) {
_lock = [[NSLock alloc] init];
}
return _lock;
}
- (void)viewDidLoad {
[super viewDidLoad];
/*
//创建
// 创建自定义并行队列
dispatch_queue_t concurentQueue = dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
//添加任务
dispatch_async(concurentQueue, ^{
NSLog(@"任务一");
});
dispatch_async(concurentQueue, ^{
NSLog(@"任务二");
});
//执行完现在的任务才执行后面的任务
dispatch_barrier_async(concurentQueue, ^{
NSLog(@"我的这个任务执行了才执行后面的任务");
});
dispatch_async(concurentQueue, ^{
NSLog(@"任务三");
});
//延迟任务
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), concurentQueue, ^{
NSLog(@"我是延迟任务");
});
//重复执行多次
dispatch_apply(3, concurentQueue, ^(size_t t) {
NSLog(@"我的这个任务要执行多次哦,%ld",t);
});
dispatch_async(dispatch_get_main_queue(), ^{
#pragma mark--------------获取现在线程(number,name)
//注意:只要number不是1,都是子线程,number的值表示优先级。
NSLog(@"%@",[NSThread currentThread]);
});
dispatch_queue_t globleQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globleQueue, ^{
NSLog(@"%@",[NSThread currentThread] );
});
*/
#pragma mark---------------线程间通信
//主线程
// //主线程到子线程
// [self performSelectorInBackground:@selector(subThreadAction) withObject:nil];
//
// //方式二:直接在队列中调用从主对列中添加任务的方法
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//
// dispatch_async(dispatch_get_main_queue(), ^{
//
// NSLog(@"%@",[NSThread currentThread]);
//
// });
// });
//
//原子性的setter和getter方法
// @property (automic,strong)NSString *name;
//
// //setter
//
// -(void)setName:(name)
// {
// @synchronized(_name)//同步锁,保证同时只有一个线程可以访问此对象
//注意:基本数据类型不能加锁,只有对象才能加锁
// {
// if (_name != name) {
// [_name release];
// _name = [name retain];
// }
// }
// }
//getter
// -(NSString *)name
// {
// @synchronized(_name){
// return [[_name retain] autorelease];
// }
// }
#pragma mark-------------多线程访问服务器买票
//创建一个并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
__weak typeof(self) temp = self;
dispatch_async(concurrentQueue, ^{
for (int i = 0;i < 1000; i ++) {
[temp buyTicket];
}
});
dispatch_async(concurrentQueue, ^{
for (int i = 0;i < 1000; i ++) {
[temp buyTicket];
}
});
}
#pragma mark---------------一般方法回到主线程
/*
//子线程方法
-(void)subThreadAction
{
NSLog(@"%@",[NSThread currentThread]);
NSString *string = @"阿斯顿";
//方式一:
//子线程回到主线程
waitUntilDone是YES的话,子线程结束后 会阻塞主线程 走callBack方法
如果是NO的话 就不会阻塞 主线程
[self performSelectorOnMainThread:@selector(mainThreadAction:) withObject:string waitUntilDone:YES];
}
//主线程方法
-(void)mainThreadAction:(id)sender
{
NSLog(@"%@",sender);
NSLog(@"%@",[NSThread currentThread]);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
*/
@interface ViewController ()
//NSLock
//既可以对基本数据类型的数据加锁,也可以对对象加锁,是万能的
@property(nonatomic,strong) NSLock *lock;
@end
@implementation ViewController
//服务器的余票数
static NSInteger count = 5000;
//买票方法
-(void)buyTicket
{
[self.lock lock];
count --;
NSLog(@"%ld",count);
[_lock unlock];
}
//给lock懒加载,分配内存
-(NSLock *)lock
{
if (_lock == nil) {
_lock = [[NSLock alloc] init];
}
return _lock;
}
- (void)viewDidLoad {
[super viewDidLoad];
/*
//创建
// 创建自定义并行队列
dispatch_queue_t concurentQueue = dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
//添加任务
dispatch_async(concurentQueue, ^{
NSLog(@"任务一");
});
dispatch_async(concurentQueue, ^{
NSLog(@"任务二");
});
//执行完现在的任务才执行后面的任务
dispatch_barrier_async(concurentQueue, ^{
NSLog(@"我的这个任务执行了才执行后面的任务");
});
dispatch_async(concurentQueue, ^{
NSLog(@"任务三");
});
//延迟任务
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), concurentQueue, ^{
NSLog(@"我是延迟任务");
});
//重复执行多次
dispatch_apply(3, concurentQueue, ^(size_t t) {
NSLog(@"我的这个任务要执行多次哦,%ld",t);
});
dispatch_async(dispatch_get_main_queue(), ^{
#pragma mark--------------获取现在线程(number,name)
//注意:只要number不是1,都是子线程,number的值表示优先级。
NSLog(@"%@",[NSThread currentThread]);
});
dispatch_queue_t globleQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globleQueue, ^{
NSLog(@"%@",[NSThread currentThread] );
});
*/
#pragma mark---------------线程间通信
//主线程
// //主线程到子线程
// [self performSelectorInBackground:@selector(subThreadAction) withObject:nil];
//
// //方式二:直接在队列中调用从主对列中添加任务的方法
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//
// dispatch_async(dispatch_get_main_queue(), ^{
//
// NSLog(@"%@",[NSThread currentThread]);
//
// });
// });
//
//原子性的setter和getter方法
// @property (automic,strong)NSString *name;
//
// //setter
//
// -(void)setName:(name)
// {
// @synchronized(_name)//同步锁,保证同时只有一个线程可以访问此对象
//注意:基本数据类型不能加锁,只有对象才能加锁
// {
// if (_name != name) {
// [_name release];
// _name = [name retain];
// }
// }
// }
//getter
// -(NSString *)name
// {
// @synchronized(_name){
// return [[_name retain] autorelease];
// }
// }
#pragma mark-------------多线程访问服务器买票
//创建一个并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
__weak typeof(self) temp = self;
dispatch_async(concurrentQueue, ^{
for (int i = 0;i < 1000; i ++) {
[temp buyTicket];
}
});
dispatch_async(concurrentQueue, ^{
for (int i = 0;i < 1000; i ++) {
[temp buyTicket];
}
});
}
#pragma mark---------------一般方法回到主线程
/*
//子线程方法
-(void)subThreadAction
{
NSLog(@"%@",[NSThread currentThread]);
NSString *string = @"阿斯顿";
//方式一:
//子线程回到主线程
waitUntilDone是YES的话,子线程结束后 会阻塞主线程 走callBack方法
如果是NO的话 就不会阻塞 主线程
[self performSelectorOnMainThread:@selector(mainThreadAction:) withObject:string waitUntilDone:YES];
}
//主线程方法
-(void)mainThreadAction:(id)sender
{
NSLog(@"%@",sender);
NSLog(@"%@",[NSThread currentThread]);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
*/