同步锁

作者: LeeDev | 来源:发表于2017-03-17 11:33 被阅读24次

    原文

    • @synchronized(self){}
    - (void)synchronizadTest2 {
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"线程A,准备好");
            @synchronized(self){
                NSLog(@"线程A lock, 请等待");
                [NSThread sleepForTimeInterval:3];
                NSLog(@"线程A 执行完毕");
            }
            
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"线程B,准备好");
            //相当于 对整个 对象 都加锁
            @synchronized(self){
                NSLog(@"线程B lock, 请等待");
                [NSThread sleepForTimeInterval:1];
                NSLog(@"线程B 执行完毕");
            }
        });
    }
    
    >打印结果
    2017-03-17 11:30:47.312 同步锁[3600:51507] 线程B,准备好
    2017-03-17 11:30:47.312 同步锁[3600:51506] 线程A,准备好
    2017-03-17 11:30:47.313 同步锁[3600:51507] 线程B lock, 请等待
    2017-03-17 11:30:48.382 同步锁[3600:51507] 线程B 执行完毕
    2017-03-17 11:30:48.383 同步锁[3600:51506] 线程A lock, 请等待
    2017-03-17 11:30:51.452 同步锁[3600:51506] 线程A 执行完毕
    
    
    • @synchronized(obj){}
    - (void)synchronizadTest {
        
        
        static NSObject *lock = nil;
        
        if (!lock) {
            lock = [[NSString alloc] init];
            
        }
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"线程A,准备好");
            @synchronized(lock){
                NSLog(@"线程A lock, 请等待");
                [NSThread sleepForTimeInterval:3];
                NSLog(@"线程A 执行完毕");
            }
            
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"线程B,准备好");
            @synchronized(lock){
                NSLog(@"线程B lock, 请等待");
                [NSThread sleepForTimeInterval:1];
                NSLog(@"线程B 执行完毕");
            }
        });
    }
    打印结果
    2017-03-17 11:32:17.982 同步锁[3626:52584] 线程B,准备好
    2017-03-17 11:32:17.982 同步锁[3626:52587] 线程A,准备好
    2017-03-17 11:32:17.983 同步锁[3626:52584] 线程B lock, 请等待
    2017-03-17 11:32:19.053 同步锁[3626:52584] 线程B 执行完毕
    2017-03-17 11:32:19.053 同步锁[3626:52587] 线程A lock, 请等待
    2017-03-17 11:32:22.124 同步锁[3626:52587] 线程A 执行完毕
    
    
    • lock
    - (void)NSLookTest {
        
        static NSLock *lock = nil;
        if (!lock) {
            lock = [[NSLock alloc] init];
        }
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"线程A,准备好");
            [lock lock];
            NSLog(@"线程A lock, 请等待");
            [NSThread sleepForTimeInterval:3];
            NSLog(@"线程A 执行完毕");
            // 这里如果注释了 其他地方 就不能访问了
            [lock unlock];
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"线程B,准备好");
            [lock lock];
            NSLog(@"线程B lock, 请等待");
            [NSThread sleepForTimeInterval:1];
            NSLog(@"线程B 执行完毕");
            [lock unlock];
        });
        
    }
    

    相关文章

      网友评论

          本文标题:同步锁

          本文链接:https://www.haomeiwen.com/subject/iahenttx.html