美文网首页
@synchronized

@synchronized

作者: 05fad25aea68 | 来源:发表于2018-03-09 18:13 被阅读9次

@synchronized这个结构发挥了和锁一样的作用:它避免了多个线程同时执行同一段代码。和使用NSLock进行创建锁、加锁、解锁相比,在某些情况下@synchronized会更方便、更易读。

@implementation ThreadSafeQueue {
    NSMutableArray *_elements;
    NSLock *_lock;
}

- (instancetype)init {
    self = [super init];
    if (self) {
        _elements = [NSMutableArray array];
        _lock = [[NSLock alloc] init];
    }
    return self;
}

- (void)push:(id)element {
    [_lock lock];
    [_elements addObject:element];
    [_lock unlock];
}

@end
@implementation ThreadSafeQueue {
    NSMutableArray *_elements;
}

- (instancetype)init {
    self = [super init];
    if (self) {
        _elements = [NSMutableArray array];
    }
    return self;
}

- (void)increment {
    @synchronized (self) {
        [_elements addObject:element];
    }
}

@end

这个@synchronized的代码块和前面例子中的[ _lock unlock]、[ _lock unlock]的作用相同作用效果。你可以把它理解成把self当作一个NSLock来对self进行加锁。在运行{后的代码前获取锁,并在运行}后的其他代码前释放这个锁。这非常的方便,因为这意味着你永远不会忘了调用unlock

你也可以在任何Objective-C的对象上使用@synchronized。因此,同样的我们也可以像下面的例子里一样,使用@synchronized(_elements)来代替@synchronized(self),这两者的效果是一致的。

深入探究:@synchronized是如何加锁/解锁的
在@synchronized中改变加锁的对象 Apple的文档传入@synchronized的参数和这个锁有什么关系?@synchronized是否持有它所加锁的对象?如果传入@synchronized代码块的对象在代码块里被析构了或者被置为nil了会怎么样?这些都是我想问的问题。

相关文章

网友评论

      本文标题:@synchronized

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