同步锁

原文

  • @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];
    });
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容