线程之间的通信、加锁解锁

#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.
}
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值