@synchronized 结构所做的事情跟锁(Lock)类似:它防止不同线程同事执行同一段代码。但在某些情况下,相比于使用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
/*
上面的ThreadSafeQueue类有个init方法,它初始化了一个_elements数组和一个NSLock实例。这个类还有个push:方法,它先获取锁、然后向数组中插入元素、最终释放锁。可能会有许多线程同时调用pash:方法,但是[_elements addObject:element]这行代码在任何时候将智慧在一个线程上运行。步骤如下:
1.线程A调用push:方法
2.线程B调用push:方法
3.线程B调用[_lock lock]因为当前没有其他线程持有锁,线程B获得了锁
4.线程A调用[_lock lock],但是锁已经被线程B占了所以方法调用并没有返回-这回暂停线程A的执行
5.线程B向_e