@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了会怎么样?这些都是我想问的问题。
网友评论