在没有GCD之前,处理同步可以用
如何用GCD写好用的线程安全方法?
@synchronized
或
NSLock
这种方式来加锁。但是效率上就不尽如人意。
_queue=dispatch_queue_create("com.navy.queue", NULL);
- (NSString)someString{
__block NSString *str;
dispatch_sync(_queue, ^{
str = _someString;
});
return str;
}
- (void)setSomeString:(NSString *)someString {
dispatch_sync(_queue, ^{
_someString = someString;
});
};
这种方式使用串行队列同步方式来实现线程安全的属性访问,同一队列,设置和获取都是串行,不会有问题。
不过可以再优化下,设置方法可以修改为异步dispatch_async
,不过执行异步会copy lock,如果简单的方法测试效果上可能比同步更慢,复杂的方法的话可以修改为这种方案。
还有更快的方式,多个获取之间可以并行,但是获取和设置方法不能并行,可以使用并行队列。
_queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- (NSString)someString{
__block NSString *str;
dispatch_sync(_queue, ^{
str = _someString;
});
return str;
}
- (void)setSomeString:(NSString *)someString {
dispatch_barrier_async(_queue, ^{
_someString = someString;
});
};
dispatch_barrier_async
表示这个block必须单独执行,不能和其他block并行,只对并发队列有意义。
设置方法必须用同步,因为返回值必须等block里面赋值成功才行。